黑马程序员——OC语言加强---NSValue的介绍和使用

                                                                ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

NSValue的介绍和使用

1、NSValue的介绍和使用

    NSValue包装对象指针,CGRect结构体等

    一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object is。

    NSValue 类的目标就是允许以上数据类型的数据结构能够被添加到集合里,

    例如那些需要其元素是对象的 数据结构,如NSArray或者NSSet的实例。

    需要注意的是NSValue对象一直是不可枚举的。 

为了方便结构体和NSValue 的转换,Foundation提供了以下方法

将结构体包装成NSValue对象-------> 存储结构体到集合中 

+ (NSValue *)valueWithPoint:(NSPoint)point;

+ (NSValue *)valueWithSize:(NSSize)size;

+ (NSValue *)valueWithRect:(NSRect)rect;

从NSValue对象取出之前包装的结构体

- (NSPoint)pointValue;

- (NSSize)sizeValue;

- (NSRect)rectValue; 

不能直接放NSPoint类型的数据在数组中 

+ (NSValue *)valueWithBytes:(constvoid *)value objCType:(const char*)type; 

创建一个NSValue

value:对象地址

objCType:通常是一个用来描述对象类型和大小的字符串,

@encode可以接受一个数据类型 的名称自动生成一个合适的描述字符串 

- (void)getValue:(void *)value(出参); 

从接受value的对象中

提取数值;

提取的数值,存放在这个指针所指向的内存块里 

    typedef struct {

       int year;

       int month;

       int day;

    } Date;

    Date d = {2015,2, 1};

    //将结构体d包装成NSValue对象

    NSValue *dValue = [NSValuevalueWithBytes:&d objCType:@encode(Date)];

    NSArray *array = @[dValue];    

    //取出value之前包装的结构体数据

    Date newD;

    [dValue getValue:&newD];

<span style="font-size:14px;">#import <Foundation/Foundation.h>
void test(){
    
    //创建一个结构体变量,保存点
    // p1 是 CGPoint 类型的结构体变量
    CGPoint p1 = CGPointMake(20, 50);
    NSRect r1 = NSMakeRect(0, 0, 200, 100);
    //创建数组
    NSMutableArray *arr = [NSMutableArray array];
    //p1 ---> obj
    //valueWithPoint    把结构体转换为NSValue对象
    NSValue *pointVal = [NSValue valueWithPoint:p1];
    //把对象存放到数组中
    [arr addObject:pointVal];
    [arr addObject:[NSValue valueWithRect:r1]];
    
    NSLog(@"arr = %@",arr);
    
    //取出r1的值
    // rectValue 从NSValue对象中,取得NSRect类型的值
    NSValue *r1Val = [arr lastObject];
    NSRect r2 = [r1Val rectValue];
    
    NSLog(@"%@",NSStringFromRect(r2));

}

typedef struct D{
    int year;
    int month;
    int day;

} MyDate;   //MyDate是一个别名

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        // 保存 一个 年月日
        // 2015-5-7
        MyDate md = {2015,5,7};
        // md -----> obj
        //@encode(MyDate) 作用,把MyDate类型生成一个常量字符串描述
        NSValue *val = [NSValue valueWithBytes:&md objCType:@encode(MyDate)];
        //定义一个数组,把val存到数组中
        NSMutableArray *arr = [NSMutableArray arrayWithObject:val];
        
        //从数组中取出来NSValue对象
        //从对象中,取出结构体变量的值
        // 传入一个结构体变量的地址
        MyDate tmd;
        // getValue获取结构值,保存到结构体变量tmd
        [val getValue:&tmd];
        
        NSLog(@"%d,%d,%d",tmd.year,tmd.month,tmd.day);
         
    }
    return 0;
}</span>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值