NSValue可以包装所有的数据类型,而前一篇博客写到的NSNumber也是继承自NSValue,在API中我们可以发现,实际上是用了分类进行了扩充,因为集合中需要的是OC对象,所以我们使用的基本数据类型和结构体都可以使用NSValue进行包装,再丢给集合。
CGPoint p=CGPointMake(20, 10); //@encode(CGPoint)标示类型,转换成C语言字符串 NSValue *v= [NSValue valueWithBytes:&p objCType:@encode(CGPoint)];
NSArray *aa=@[@"123456",@10.5,v];
CGPoint p2; //返回的一个指针 [aa[2] getValue:&p2]; NSLog(@"p2==%@",NSStringFromPoint(p2));
//系统自带的结构体用以下方式 NSValue *valus =[NSValue valueWithPoint:CGPointMake(20, 10)]; [NSValue valueWithRect:CGRectMake(20, 20, 122, 300)]; [valus pointValue];
//自定义结构体包装 struct Student{ int age; }; struct Student su={15}; [NSValue valueWithBytes:&su objCType:@encode(struct Student)];
//用typedef的方式更简单 typedef struct { int age; }Student2; Student2 stu={22}; [NSValue valueWithBytes:&stu objCType:@encode(Student2)]; |
总结:
1、系统自带的结构体类型和基本数据类型我们可以用NSValue的类方法以value开头的方法对各类型进行包装
2、自定义的结构体需要我们使用valueWithBytes获取存储结构体的地址和@encode获取结构体的结构。