---------- IOS培训、java培训、期待与您交流! ----------
NSNumber 是NSValue的子类,但NSNumber只能包装数字类型,NSValue可以包装任意值
也就可以用NSValue包装结构体后加入NSArray NSDictionary等集合中
创建NSValue的常用方法
-(id)initWithBytes:(const void *)value objCType:(const char *)type
+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type
+(NSValue *)value:(const void *)value objCType:(const char *)type
value 参数是想要包装的数据的地址(如一个NSPoint)的地址,可以用&来取地址),
type参数是用来描述这个数据类型的字符串,用@encode()指令来生成;
-(void)getValue:(void *)value
获取所包装的数据,保存到value这个地址
-(const char*)objCType
返回描述所包装数据类型的字符串
-(BOOL)isEqualToValue:(NSValue *)value
为了方便struct和NSValue的转换,cocoa还提供了以下方法:
+(NSValue *)valueWithPoint:(NSPoint)point
+(NSValue *)valueWithSize:(NSSize)size
+(NSValue *)valueWithRect:(NSRect)rect
-(NSPoint)pointValue
-(NSSize)sizeValue
-(NSRect)rectValue
实例、具体运用如下:
CGPoint point = CGPointMake(10, 10);
// 将结构体变量包装成一个对象
NSValue *value = [NSValue valueWithPoint:point];
NSMutableArray *array = [NSMutableArray array];
// 添加value
[array addObject:value];
// 取出当时放进去的value
NSValue *value1 = [array lastObject];
CGPoint point1 = [value1 pointValue];
BOOL result = CGPointEqualToPoint(point1, point);
NSLog(@"result=%i", result);
如下我们把一个结构体类型通过NSvalue包装成一个对象。然后将之解包。
typedef struct {
int year;
int month;
int day;
} Date;
void value2() {
Date date = {2015, 2, 15};
// void *代表任何指针
// 这里要传结构体的地址&date
// 根据结构体类型生成 对应的 类型描述字符串
char *type = @encode(Date);
NSValue *value = [NSValue value:&date withObjCType:type];
// 定义一个结构体变量
Date date1;
// 取出包装好的结构体
[value getValue:&date1];
// [value objCType]; 取出类型描述字符串
NSLog(@"year=%i, month=%i, day=%i", date1.year, date1.month, date1.day);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
value2();
}
return 0;
}
运行结果如下:
2015-02-15 17:31:39.671 Foundation12-NSValue[1347:225487] year=2015, month=2, day=15
Program ended with exit code: 0