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.2将value1里包装的结构体存进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的主要内容,如果未能解决你的问题,请参考以下文章