Effective系列-02
1.property
在OC中筐赔,一個對象擁有的實(shí)例變量往往聲明為屬性(property)。而不推薦像Java沐绒、C++那種在public/private下聲明變量犁柜。當(dāng)我們需要訪問一個類的屬性時,可以使用點(diǎn)語法圾笨,編譯器會將點(diǎn)語法轉(zhuǎn)換為調(diào)用類中對應(yīng)屬性的setter/getter方法教馆。因此以下兩種方法等效:
Person *person1=[Person new];
//點(diǎn)語法
person1.name=@"Jack";
NSLog(@"%@",person1.name);
//方法調(diào)用
[person1 setName:@"Jack"];
NSLog(@"%@",[person1 name]);
其中調(diào)用的setter、getter方法是由編譯器自動編寫擂达,這個過程是在編譯器執(zhí)行土铺。當(dāng)我們不需要其自動編寫setter、getter方法時板鬓,可以在.m文件中添加如下代碼
@dynamic name;
屬性也會因?yàn)槠淅ㄌ杻?nèi)的修飾符而具有一些其特有的性質(zhì)(如nonatomic悲敷、weak等)。
2.實(shí)例變量
OC中俭令,聲明完屬性后編譯器會創(chuàng)建一個相應(yīng)的實(shí)例變量后德,這個實(shí)例變量為“屬性名”。通常抄腔,我們在類的外部需要訪問實(shí)例變量時瓢湃,需要使用點(diǎn)語法理张,而當(dāng)在內(nèi)部訪問實(shí)例變量時,更推薦使用直接訪問的方法箱季,即直接使用“屬性名”涯穷。相比于在內(nèi)部也使用點(diǎn)語法通過屬性訪問,使用實(shí)例變量不需要有方法調(diào)用的過程藏雏,編譯器生成的代碼會直接訪問實(shí)例變量的那塊內(nèi)存拷况。
這樣的話,需要注意的一點(diǎn)就是由于直接訪問內(nèi)存而不會調(diào)用setter/getter方法掘殴,因此copy修飾的屬性使用實(shí)例變量進(jìn)行賦值時赚瘦,不會進(jìn)行copy操作。此時與strong則完全一樣奏寨,先retain新值再release舊值起意。
3.小結(jié)
在之前自己悶頭寫代碼的時候,確實(shí)沒有考慮到這些區(qū)別病瞳。完全是哪個寫的順手揽咕、想怎么寫就怎么寫,在知道了這些區(qū)別后套菜,有點(diǎn)感慨自己的不足亲善。