NSValue對象
Objective-C 中的NSValue的詳解
一個NSValue對象是用來存儲一個C或者Objective-C數據的簡單容器。它可以保存任意類型的數據,比如int,float,char,當然也可以是指pointers, structures, and object ids。NSValue類的目標就是允許以上數據類型的數據結構能夠被添加到集合里,例如那些需要其元素是對象的數據結構,如NSArray或者NSSet的實例。需要注意的是NSValue對象一直是不可枚舉的。
我們可以使用NSValue來輔助我們實現(xiàn)一些簡單數據結構的封裝。比如我們定義了一個簡單的結構體類型
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結構體等