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)];

本文深入解析NSValue在Objective-C中的应用,展示如何利用NSValue存储结构体数据、指针及不同类型的对象,并演示从对象中提取数据的方法。通过实例操作,详细说明了NSValue的初始化、数据类型识别以及数据提取的过程。
293

被折叠的 条评论
为什么被折叠?



