一.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.对象转指针
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,CGSize转NSValue
它们都是结构体,是由苹果已经封装好的结构体
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来转化