一、NSValue概述
NSValue类是NSNumber类的父类,也是一个类簇,NSNumber类用于对简单数据类型进行装箱,变成对象;NSValue类用于对复杂数据类型(指针、结构体)进行装箱,变成对象。
二、NSValue的使用
1.创建对象--装箱
将结构体封装成对象,以对象的形式展现
#import <Foundation/Foundation.h>
struct Student{
int age;
float score;
char * name;
} s1={12, 82.5f, "Andy"};
int main(int argc, const char * argv[]) {
@autoreleasepool {
//NSValue是NSNumber的父类,也是一个类簇。用来把指针、结构体等复杂数据类型存储为对象。
NSValue * value = [[NSValue alloc] initWithBytes: &s1 objCType: @encode(struct Student)];
/*参数1:地址
参数2:类型唯一标志,是一个字符串
*/
NSLog(@"%s", @encode(int)); //i
NSLog(@"%s", @encode(struct Student));//{Student=if*}, i-int, f-float, *-string
}
return 0;
}
理解@encode的作用:它以简写的字符串形式来表示一个类型。
i-->int
f-->float
*-->string
2.判断一个value是否属于某个对象类型
if( strcmp(value.objCType, @encode(struct Student)) == 0){
NSLog(@"This value' type is struct Student.");
}
}
3.获得NSValue中的数据-拆箱
struct Student s2;
[value getValue: &s2];
NSLog(@"%@", value);
NSLog(@"age=%d, score=%f, name=%s", s2.age, s2.score, s2.name);
4.对指针数据类型进行装箱和拆箱
上面已经演示了如何对结构体数据类型进行装箱和拆箱,这里演示的是如何对指针数据类型进行装箱和拆箱。
//装箱
char * p = (char *) 0x1f;
NSValue * value = [[NSValue alloc] initWithBytes: &p objCType:@encode(char *)];
//拆箱
char * p2;
[value getValue: &p2];
NSLog(@"%p", p2);
5.OC中常用结构体装箱
//OC中有几个常用的结构体
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)];
@诗未冷学习博客