一.NSValue和NSNumber关系

NSValue是NSNumber的父类,两者都是对数据类型进行转化成对象以方便操作的。不同点在于:NSNumber是对基本数据类型进行分装,但是对结构体和指针转化不了,这一点NSValue要范围要广,对结构体和指针转为对象,NSValue可以做到。

二.结构体与对象

1.首先建一个结构体:

struct sct{
    int english;
    float math;
} score = {80,92.5f};

2.结构体转为对象

        //意图?将结构体类型数据包装进nsvalue当中
//第一个常数:传入结构体的地址,这样才能知道我们要存储的数据在哪里 //第二个常数:将要存储的数据类型转化为c语言的字符串 NSValue *value = [[NSValue alloc]initWithBytes:&score objCType:@encode(struct sct)]; NSLog(@"%s",@encode(struct sct)); //这是把结构体的数据类型进行转化为c语言的字符串

  输出结果:

2016-06-29 20:17:55.527 NSValue[555:85711] {sct=if}  //结构体的数据类型转为c语言的字符串,i为int类型,f为float类型
Program ended with exit code: 0

2.做对象才能做的操作:比如将对象存入字典

        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:value,@"key", nil];
        NSValue *value1 = [dic objectForKey:@"key"];
        NSLog(@"%@",value1);

value1答应结果为:

2016-06-29 20:26:05.652 NSValue[579:112040] <50000000 0000b942>  //对象的地址
Program ended with exit code: 0

3.NSValue还原成结构体

3.1声明一个空的结构体变量

struct sct score2;

3.2value1里包装的结构体存进3.1步骤的空的结构体变量中

        //&:表示将value1取出的数据存放到哪里
        [value1 getValue:&score2];
NSLog(@"english = %d,math = %f",score2.english,score2.math);

  输出结果:

2016-06-29 20:38:57.380 NSValue[603:155723] english = 80,math = 92.500000
Program ended with exit code: 0

三.指针与对象

1.首先创建一个指针

char *p = (char *)0x1f;  //对十六进制的数进行强制转换

2.指针转为对象

        NSValue *value3 = [[NSValue alloc]initWithBytes:&p objCType:@encode(char *)];
        NSLog(@"%@",value3);

  输出结果:

2016-06-29 20:51:16.940 NSValue[624:197140] <1f000000 00000000>

3.对象转指针

3.1.声明一个空的指针

char *q;

3.2.对象转指针

        [value3 getValue:&q];
        NSLog(@"%c",q);

   输出结果:

2016-06-30 11:41:42.237 NSValue[525:31317]   //输出结果为空的,因为是一个空的指针
Program ended with exit code: 0

四.NSRange,CGPoint,CGSizeNSValue

 它们都是结构体,是由苹果已经封装好的结构体

4.1转对象

        NSRange range = NSMakeRange(2, 3);
        NSValue *value = [NSValue valueWithRange:range];
        
//        [NSValue valueWithPoint:point];
//        [NSValue valueWithSize:size];
//        [NSValue valueWithRect:rect];

4.2对象还原

        NSRange range1;
        [value5 getValue:&range1];
        NSLog(@"%d,%d",range1.location,range1.length);

   输出结果:

2016-06-30 11:54:18.099 NSValue[548:69907] 2,3
Program ended with exit code: 0

五.总结

1.NSValue是NSNumber的父类,它不只可以把int,float,char等这些基本的数据类型的数据转为对象,也可以把结构体以及指针转为对象

2.苹果已经封装好的结构体直接用valuewith就可以转为对象,自定义的结构和指针用initWithBytes将结构体转为对象,对象还原都是通过getValue来转化

 

  

posted on 2016-06-29 20:55  chengkaihua  阅读(213)  评论(0编辑  收藏  举报