Foundation--NSValue

NSNumber是NSValue的子类,NSValue可以封装任意值。使用下面的类方法便能创建新的NSValue对象。
- (instancetype)initWithBytes:(const voidvoid *)value objCType:(const charchar *)type 

传递的参数是你想要封装的数值的地址(NSSize或你自己的struct)。通常你得到的是想要存储的变量的地址( 在C语言要使用操作符& )。你也可以提供一个用来描述这个数据类型的字符串,通常用来说明struct中实体的类型和大小。你不用自己写代码来生成这个字符串,@encode编译器指令可以接收数据类型的名称并为你生成合适的字符串。所以按照如下方式把NSRect放入NSArray中。
NSRect rect = NSMakeRect(1, 2, 3, 4);  
NSValue *value = [NSValue value:&rect withObjCType:@encode(NSRect)];  
[array addObject:value];  

可以使用

- (void)getValue:(voidvoid *)value; 
来提取数值,调用getValue:时,需要传递存储这个数值的变量地址:

value = [array objectAtIndex: 0];  
[value getValue: &rect]; 
在上面的getValue:中,你可以看到方法名中使用了get,表明我们提供的是一个指针,而指针指向的空间则用来存储该方法生成的数据。


Cocoa提供了将常用的struct类型数据转换成NSValue的便捷方法:
+ (NSValue *)valueWithCGPoint:(CGPoint)point;  
+ (NSValue *)valueWithCGSize:(CGSize)size;  
+ (NSValue *)valueWithCGRect:(CGRect)rect;  
- (NSPoint)pointValue;  
- (NSSize)sizeValue;  
- (NSRect)rectValue;  
可以按照以下方式在NSArray中存储和提取NSRect的值
value = [NSValue valueWithCGRect:rect];  
[array addObject: value];  
NSRect annother = [value rectValue];  





你可能感兴趣的:(ios,Foundation)