1.NSValue基本概念
-
NSNumber是NSValue的子类, 但NSNumber只能包装数字类型
-
NSValue可以包装任意值
- 因此, 可以用NSValue将结构体包装后,加入NSArray\NSDictionary中
2. 常见结构体的包装
- 为了方便 结构体 和NSValue的转换,Foundation提供了以下方法
- 将结构体包装成NSValue对象
+ (NSValue *)valueWithPoint:(NSPoint)point; + (NSValue *)valueWithSize:(NSSize)size; + (NSValue *)valueWithRect:(NSRect)rect;
- 从NSValue对象取出之前包装的结构体
- (NSPoint)pointValue; - (NSSize)sizeValue; - (NSRect)rectValue;
3.任意数据的包装
- NSValue提供了下列方法来包装任意数据
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; + value参数 : 所包装数据的地址 + type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成 - 从NSValue中取出所包装的数据 - (void)getValue:(void *)value;
// main.m // NSValue #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { /* typedef struct{ int age; char *name; double _height; }Person; Person p = {30, "lnj", 1.75}; // NSArray *arr = @[p]; */ // 1.利用NSValue包装常用的结构体 /* CGPoint point = NSMakePoint(10, 20); NSValue *value = [NSValue valueWithPoint:point]; NSArray *arr = @[value]; NSLog(@"%@", arr); */ // 2.利用NSValue包装自定义的结构体 typedef struct{ int age; char *name; double height; }Person; Person p = {30, "lnj", 1.75}; // valueWithBytes: 接收一个指针, 需要传递需要包装的结构体的变量的地址 // objCType: 需要传递需要包装的数据类型 NSValue *pValue = [NSValue valueWithBytes:&p objCType:@encode(Person)]; NSArray *arr = @[pValue]; NSLog(@"%@", arr); // 从NSValue中取出自定义的结构体变量 Person res; [pValue getValue:&res]; NSLog(@"age = %i, name = %s, height = %f", res.age, res.name, res.height); return 0; }