一、NSValue是什么意思 1.比如,我的iOS界面上面有4个按钮,每1个按钮是不是都有自己的坐标啊, 我想把这按钮的4个坐标存到1个数组里面去, 你看,是不是有4个CGPoint吧, CGPoint p1 = CGPointMake(10,20); CGPoint p2 = CGPointMake(110,120); CGPoint p3 = CGPointMake(110,320); CGPoint p4 = CGPointMake(110,240); 我拿到4个结构体啊,是不是CGPoint结构体啊 大家思考一下,我能不能把这4个结构体,存到我的NSArray数组里面去啊,不可以 是不是NSArray数组里面只能存OC对象啊,这4个结构体是OC对象吗,不是, 我就是要存,怎么办呢 那就需要先把这个结构体,包装到1个OC对象里面去, 再把OC对象,保存到NSArray数组里面去, 包装这个结构体的类,Foundation框架里面已经有了,叫做NSValue 2.我们之前学习的结构体: 1)NSRange 2)CGPoint 3)CGSize 4)CGRect 这些都是结构体,它们的变量是无法存储到集合之中的 解决方案: 先将这些结构体变量存储到OC对象中,再将OC对象存储到集合之中 NSValue类的对象,就是用来包装结构体变量的 例如,NSValue *v1 = [NSValue valueWithPoint:p1]; 这时候,我就把p1这个结构体包装到v1对象里面去了吧 NSValue *v2 = [NSValue valueWithPoint:p2]; NSValue *v3 = [NSValue valueWithPoint:p3]; NSValue *v4 = [NSValue valueWithPoint:p4]; 这时候,我就把p1,p2,p3,p4这4个结构体变量,包装到v1,v2,v3,v4这4个NSValue里面去了, 再把v1,v2,v3,v4这4个NSValue对象,存到NSArray数组里面去 NSArray *arr = @[v1,v2,v3,v4]; 跟我们之前讲的NSNumber是不是一样一样的啊 唯一不同的是,NSNumber是用来包装基本数据类型的,而这个NSValue呢,包装结构体的, 好,我们现在遍历出来看一下啊,元素什么类型,NSValue, for(NSValue *v in arr){ //这个时候啊,我要拿到存储在里面的结构体,该怎么拿 //v是什么东西,这个迭代变量是我们数组中的每1个元素,对不对,数组里面的每1个元素是什么,是不是NSValue对象啊,真正那个结构体,是存在这个对象里面的吧, v.pointValue; //pointValue就可以拿到封装在这个NSValue对象当中的point结构体变量, NSLog(@“%@”,NSStringFromPoint(v.pointValue)); } 4.给大家介绍几个函数啊, 1)(NSString *) NSStringFromPoint(NSPoint aPoint) 之前我们讲过一个函数, (NSString *)NSStringFromRange(NSRange range); 是不是它可以把这个结构体,Range结构体变量,转化成1个字符串啊 其实还有NSStringFromPoint, NSStringFromSize, NSStringFromRect, 这个时候,我这个NSValue里面存的是1个Point结构体吧,那我就用NSStringFromPoint, NSLog(@“%@”,NSStringFromPoint(v.pointValue)); 输出:{10,20} {110,120} {110,320} {110,240} 二、CGSize要存进去呢 CGSize s1 = CGSizeMake(100,10); CGSize s2 = CGSizeMake(100,10); CGSize s3 = CGSizeMake(100,10); CGSize s4 = CGSizeMake(100,10); 现在,我有4个CGSize结构体吧,我想把它存到NSArray里面去,怎么存, 先把CGSize结构体变量,放到哪儿去,NSValue对象里面去,对不对, NSValue *v1 = [NSValue valueWithSize:s1]; NSValue *v2 = [NSValue valueWithSize:s2]; NSValue *v3 = [NSValue valueWithSize:s3]; NSValue *v4 = [NSValue valueWithSize:s4]; NSArray *arr = @[v1,v2,v3,v4]; for(NSValue *v in arr){ NSLog(@“%@”,NSStringFromSize(v.sizeValue)); } 现在,真正的这个结构体,CGSize,是存在这个NSValue对象的属性里面的吧,哪个属性,v.sizeValue 输出:{100,10} {100,10} {100,10} {100,10} 以上,就是NSValue的全部内容