OC系列高级-NSValue

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC系列高级-NSValue相关的知识,希望对你有一定的参考价值。

一.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.NSValue还原成指针

 

  

  

以上是关于OC系列高级-NSValue的主要内容,如果未能解决你的问题,请参考以下文章

OC系列高级-内存管理

OC系列高级-类与协议

NSNumber 与NSValue

OC系列高级-内存管理关键字

OC系列高级-内存管理二

OC系列高级-代理