NSValue
NSValue是NSNumber的父类,可以将指针、结构体等复杂的数据类型存储为对象。
NSValue同NSNumber一样,也是一个类簇,它可以生成各种数据类型的对象。
把结构体数据存储为对象
struct sct{int a;
int b;
}sct1 = {4, 5};
NSValue * value = [[NSValue alloc] initWithBytes:&sct1 objCType:@encode(struct sct)];
// 第一个参数&sct1是要存储数据的地址,
// 第二个参数@encode(struct sct)是将要存储的数据类型转换成一个字符串标识
// 如 NSLog(@"%s", @encode(int)); 能打印出int型转换成的字符串标识
判断NSValue是何种数据类型的对象
用NSValue对象的objCType方法查看它的数据类型字符串标识。如:if(strcmp(value.objCType, @encode(struct sct)) == 0){
NSLog(@"It is struct sct.");
}
从结构体对象中把数据取出来
struct sct newSct1;[value getValue: &newSct1]; // 参数传入的是要存储取出来的数据的地址
// 从value对象中取出结构体数据到newSct1
NSLog(@"%d %d", newSct1.a, newSct1.b);
把指针存储为对象
char * p = 0x1f;NSValue * value = [[NSValue alloc] initWithBytes:&p objCType:@encode(char *)];
从指针对象中把指针取出来
char * newP;[value getValue: &newP]; // 传入地址
NSLog(@"%p", newP);
根据存储的数据的不同,生成的对象是不同类的对象
CGPoint point;CGSize size;
CGRect rect;
NSValue * pointValue = [NSValue valueWithPoint:point];
NSValue * sizeValue = [NSValue valueWithSize:size];
NSValue * rectValue = [NSValue valueWithRect:rect];
NSValue * rangeValue = [NSValue valueWithRange:NSMakeRange(3,4)];