@代表“Objective-C”的標(biāo)志,證明您正在使用Objective-C語言
Objective-C語言關(guān)鍵詞,@property與@synthesize配對使用。
功能:讓編譯好器自動編寫一個與數(shù)據(jù)成員同名的方法聲明來省去讀寫方法的聲明。
如:
1、在頭文件中:
等效于在頭文件中聲明2個方法:
2、實現(xiàn)文件(.m)中
等效于在實現(xiàn)文件(.m)中實現(xiàn)2個方法。
以上等效的函數(shù)部分由編譯器自動幫開發(fā)者填充完成,簡化了編碼輸入工作量。
格式:
聲明property的語法為:@property (參數(shù)1,參數(shù)2) 類型 名字;
如:
其中參數(shù)主要分為三類:
讀寫屬性: (readwrite/readonly)
setter語意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各參數(shù)意義如下:
readwrite: 產(chǎn)生setter\getter方法
readonly: 只產(chǎn)生簡單的getter,沒有setter。
assign: 默認(rèn)類型,setter方法直接賦值,而不進(jìn)行retain操作
retain: setter方法對參數(shù)進(jìn)行release舊值,再retain新值。
copy: setter方法進(jìn)行Copy操作,與retain一樣
nonatomic: 禁止多線程,變量保護(hù),提高性能
參數(shù)類型
參數(shù)中比較復(fù)雜的是retain和copy,具體分析如下:
getter 分析
1、
等效代碼:
2、
等效代碼:
setter分析
1、
等效于:
2、
等效于:
nonatomic
如果使用多線程,有時會出現(xiàn)兩個線程互相等待對方導(dǎo)致鎖死的情況(具體可以搜下線程方面的注意事項去了解)。在沒有(nonatomic)的情況下,即默認(rèn)(atomic),會防止這種線程互斥出現(xiàn),但是會消耗一定的資源。所以如果不是多線程的程序,打上(nonatomic)即可
retain
代碼說明
如果只是@property NSString*str; 則通過@synthesize自動生成的setter代碼為:
如果是@property(retain)NSString*str; 則自動的setter內(nèi)容為:
所有者屬性
我們先來看看與所有權(quán)有關(guān)系的屬性,關(guān)鍵字間的對應(yīng)關(guān)系。
屬性值關(guān)鍵字所有權(quán)strong | __strong | 有 |
weak | __weak | 無 |
unsafe_unretained | __unsafe_unretained | 無 |
copy | __strong | 有 |
assign | __unsafe_unretained | 無 |
retain | __strong | 有 |
該屬性值對應(yīng) __strong 關(guān)鍵字,即該屬性所聲明的變量將成為對象的持有者。
該屬性對應(yīng) __weak 關(guān)鍵字,與 __weak 定義的變量一致,該屬性所聲明的變量將沒有對象的所有權(quán),并且當(dāng)對象被破棄之后,對象將被自動賦值nil。
并且,delegate 和 Outlet 應(yīng)該用 weak 屬性來聲明。同時,如上一回介紹的 iOS 5 之前的版本是沒有 __weak 關(guān)鍵字的,所以 weak 屬性是不能使用的。這種情況我們使用 unsafe_unretained。
等效于__unsafe_unretaind關(guān)鍵字聲明的變量;像上面說明的,iOS 5之前的系統(tǒng)用該屬性代替 weak 來使用。
與 strong 的區(qū)別是聲明變量是拷貝對象的持有者。
一般Scalar Varible用該屬性聲明,比如,int, BOOL。
該屬性與 strong 一致;只是可讀性更強(qiáng)一些。
參考:
http://blog.eddie.com.tw/2010/12/08/property-and-synthesize/
http://www.cocoachina.com/bbs/read.php?tid=7322
http://www.cnblogs.com/pinping/archive/2011/08/03/2126150.html
在 Objective-C官方文檔 中的Property一章里有對類Property詳細(xì)說明。
@property中的聲明列表已分類為以下幾種:
1, 聲明屬性的訪問方法:
2,聲明屬性寫操作權(quán)限:
3,聲明寫方法的實現(xiàn):
4,訪問方法的原子性:
但如果設(shè)置nonatomic時,屬性的訪問為非原子性訪問。
來源:http://wiki.magiche.net/pages/viewpage.action?pageId=1540101
@synthesize tabBarController=_tabBarController;
@synthesize 中可以定義 與變量名不相同的getter和setter的命名,籍此來保護(hù)變量不會被不恰當(dāng)?shù)脑L問
聯(lián)系客服