NSValue对象
Objective-C 中的NSValue的详解
一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一直是不可枚举的。
我们可以使用NSValue来辅助我们实现一些简单数据结构的封装。比如我们定义了一个简单的结构体类型
pragma mark NSValue 结构体和对象类型的互转
// 将自定义的结构体转换为NSValue
NSRange rang = {1,3};
NSValue value = [NSValue valueWithRange:rang];
NSLog(@"%@",value);
// 定义一个学生的结构体
Student stu = {"lisi",'m',20,90};
/*
&st:要被存储的类型
objCType:
*/
NSValue *value2 = [[NSValue alloc]initWithBytes:&stu objCType:@encode(Student) ];
NSLog(@"%@",value2);
// 定义一个学生结构体变量,将NSValue中的值取出
Student stu5;
[value2 getValue:&stu5];
NSLog(@"%s",stu5.name);
// 定义一个老师结构体:在main函数之外
// 定义一个老师结构体变量
Teacher tec = {"chenggang",'m',27};
// 将变量转换成NSValue对象
NSValue *valu = [[NSValue alloc]initWithBytes:&tec objCType:@encode(Teacher)];
// 定义一个老师结构体变量,将NSValue中的值取出
Teacher tech;
[valu getValue:&tech];//获取指针所对应的地址里面的值
NSLog(@"%s",tech.name);
typedef struct
{
int id;
float height;
unsigned char flag;
}Test;
此时,我们就可以使用MyTestStruct这个结构体来很容易地封装数据。如
Test test;
test.id=1;
test.height=23.0;
test.flag='A';
NSValue *value=[NSValue valueWithBytes:&test objCType:@encode(Test)];//对结构体进行封装
NSLog(@"id=%d,height=%f,flag=%c",test.id,test.height,test.flag);
在我们想取出*value 中的数据时,可以使用如下方式:
Test test2;//声明test2,为了得到test的值
[value getValue:&test2];//同类型赋值
NSLog(@"id=%d,height=%f,flag=%c",test2.id,test2.height,test2.flag);
之后就可以对theTestStruct的操作来取得其中的数据。
对于NSValue 类的使用,还有一个地方就是我们在iPhone显示点或者其它几何图形时。比如我们想取得用户在屏幕上的点击轨迹,此时首先我们想到的就是使用 CGPoint这个结构体来保存每一次点击的数据。此时,我们就可以使用NSValue类别中的+valueWithCGPoint:来帮助我们来为CG Framework提供数据。
NSValue包装对象指针,CGRect结构体等