NSValue對(duì)象
Objective-C 中的NSValue的詳解
一個(gè)NSValue對(duì)象是用來(lái)存儲(chǔ)一個(gè)C或者Objective-C數(shù)據(jù)的簡(jiǎn)單容器。它可以保存任意類型的數(shù)據(jù)畜普,比如int板乙,float谓松,char焕妙,當(dāng)然也可以是指pointers, structures, and object ids拴事。NSValue類的目標(biāo)就是允許以上數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)能夠被添加到集合里沃斤,例如那些需要其元素是對(duì)象的數(shù)據(jù)結(jié)構(gòu),如NSArray或者NSSet的實(shí)例刃宵。需要注意的是NSValue對(duì)象一直是不可枚舉的衡瓶。
我們可以使用NSValue來(lái)輔助我們實(shí)現(xiàn)一些簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)的封裝。比如我們定義了一個(gè)簡(jiǎn)單的結(jié)構(gòu)體類型
pragma mark NSValue 結(jié)構(gòu)體和對(duì)象類型的互轉(zhuǎn)
// 將自定義的結(jié)構(gòu)體轉(zhuǎn)換為NSValue
NSRange rang = {1,3};
NSValue value = [NSValue valueWithRange:rang];
NSLog(@"%@",value);
// 定義一個(gè)學(xué)生的結(jié)構(gòu)體
Student stu = {"lisi",'m',20,90};
/*
&st:要被存儲(chǔ)的類型
objCType:
*/
NSValue *value2 = [[NSValue alloc]initWithBytes:&stu objCType:@encode(Student) ];
NSLog(@"%@",value2);
// 定義一個(gè)學(xué)生結(jié)構(gòu)體變量牲证,將NSValue中的值取出
Student stu5;
[value2 getValue:&stu5];
NSLog(@"%s",stu5.name);
// 定義一個(gè)老師結(jié)構(gòu)體:在main函數(shù)之外
// 定義一個(gè)老師結(jié)構(gòu)體變量
Teacher tec = {"chenggang",'m',27};
// 將變量轉(zhuǎn)換成NSValue對(duì)象
NSValue *valu = [[NSValue alloc]initWithBytes:&tec objCType:@encode(Teacher)];
// 定義一個(gè)老師結(jié)構(gòu)體變量哮针,將NSValue中的值取出
Teacher tech;
[valu getValue:&tech];//獲取指針?biāo)鶎?duì)應(yīng)的地址里面的值
NSLog(@"%s",tech.name);
typedef struct
{
int id;
float height;
unsigned char flag;
}Test;
此時(shí),我們就可以使用MyTestStruct這個(gè)結(jié)構(gòu)體來(lái)很容易地封裝數(shù)據(jù)坦袍。如
Test test;
test.id=1;
test.height=23.0;
test.flag='A';
NSValue *value=[NSValue valueWithBytes:&test objCType:@encode(Test)];//對(duì)結(jié)構(gòu)體進(jìn)行封裝
NSLog(@"id=%d,height=%f,flag=%c",test.id,test.height,test.flag);
在我們想取出*value 中的數(shù)據(jù)時(shí)十厢,可以使用如下方式:
Test test2;//聲明test2,為了得到test的值
[value getValue:&test2];//同類型賦值
NSLog(@"id=%d,height=%f,flag=%c",test2.id,test2.height,test2.flag);
之后就可以對(duì)theTestStruct的操作來(lái)取得其中的數(shù)據(jù)捂齐。
對(duì)于NSValue 類的使用蛮放,還有一個(gè)地方就是我們?cè)趇Phone顯示點(diǎn)或者其它幾何圖形時(shí)。比如我們想取得用戶在屏幕上的點(diǎn)擊軌跡奠宜,此時(shí)首先我們想到的就是使用 CGPoint這個(gè)結(jié)構(gòu)體來(lái)保存每一次點(diǎn)擊的數(shù)據(jù)包颁。此時(shí)缝其,我們就可以使用NSValue類別中的+valueWithCGPoint:來(lái)幫助我們來(lái)為CG Framework提供數(shù)據(jù)。
NSValue包裝對(duì)象指針徘六,CGRect結(jié)構(gòu)體等