前言
1、比较两个 NSValue 类型数据的大小
NSValue *value1 = [NSValue valueWithPoint:NSMakePoint(10, 32)];
NSValue *value2 = [NSValue valueWithPoint:NSMakePoint(10, 32)];
// isEqualToValue
BOOL bl = [value1 isEqualToValue:value2];
if (bl) {
NSLog(@"value1 == value2");
}
else {
NSLog(@"value1 != value2");
}
2、NSValue 与 OC 数据类型的相互转换
// 将 OC 数据类型转换成 NSValue
NSValue *value1 = [NSValue valueWithPoint:NSMakePoint(10, 32)];
// 将 NSValue 转换成 OC 数据类型
NSPoint point = [value1 pointValue];
NSLog(@"x: %.0f, y: %.0f", point.x, point.y);
3、NSValue 与 自定义数据类型 的相互转换
// 将 自定义数据类型 转换成 NSValue
// 自定义结构体
typedef struct { int year; int month; int day; } MyDate;
MyDate date = {2016, 1, 11};
// 取要转换的数据的地址
void *valueAdd = &date;
// 将自定义数据类型装换成 C 语言字符串
char *objCType = @encode(MyDate);
// 对象方法,将自定义数据类型转换成 NSValue
NSValue *value2 = [[NSValue alloc] initWithBytes:valueAdd objCType:objCType];
// 类方法,将自定义数据类型转换成 NSValue
NSValue *value3 = [NSValue valueWithBytes:&date objCType:@encode(MyDate)];
// 将 NSValue 转换成 自定义数据类型
MyDate date1;
MyDate date2;
// 从 NSValue 中取出的值放到 &date1 中
[value2 getValue:&date1];
// 从 NSValue 中取出的值放到 &date2 中
[value3 getValue:&date2];
NSLog(@"%i, %i, %i", date1.year, date1.month, date1.day);
NSLog(@"%i, %i, %i", date2.year, date2.month, date2.day);
// 从 NSValue 中取出自定义的数据类型
const char *type = [value2 objCType];
NSLog(@"%@", [NSString stringWithUTF8String:type]);