通常我們習(xí)慣于如下方式定義一個(gè)屬性轰豆,并通過(guò)點(diǎn)語(yǔ)法來(lái)調(diào)用屬性的getter
和setter
方法胰伍。有時(shí)當(dāng)重寫(xiě)getter
或setter
方法時(shí)還會(huì)使用帶下劃線的同名實(shí)例變量_str
。那么酸休,getter
和setter
以及這個(gè)實(shí)例變量是哪里來(lái)的骂租。
@property (nonatomic, strong) NSString *str
iOS6之后 llvm編譯器引入property autosysthesis
屬性自動(dòng)合成。
也就是說(shuō)property
定義的屬性會(huì)自動(dòng)添加這樣一行代碼 @synthesize propertyName = _propertyName
這也就是為什么property
屬性可以用帶下劃線的屬性
@synthesize propertyName = _propertyName
這行代碼的作用是
- 給
propertyName
這個(gè)屬性生成getter
和setter
方法斑司。 - 同時(shí)生成一個(gè)帶下劃線前綴的實(shí)例變量渗饮。或者說(shuō)給
propertyName
添加一個(gè)別名
什么時(shí)候會(huì)用到synthesize
當(dāng)下面這些情況的時(shí)候宿刮,系統(tǒng)不會(huì)自動(dòng)的進(jìn)行屬性合成抽米。也就是不會(huì)自動(dòng)的生成getter
和setter
方法也不會(huì)自動(dòng)的生成帶_
的實(shí)例變量。而我們需要使用實(shí)例變量和相關(guān)方法的時(shí)候糙置,就需要手動(dòng)添加synthesize
來(lái)合成實(shí)例變量云茸。
- 同時(shí)重寫(xiě)getter和setter方法時(shí),不會(huì)自動(dòng)合成屬性谤饭。當(dāng)我們只重寫(xiě)其中一個(gè)的時(shí)候還是會(huì)進(jìn)行屬性自動(dòng)合成的
- 重寫(xiě)了只讀屬性的getter方法時(shí)标捺。即表示當(dāng)重寫(xiě)了
readonly
屬性的getter
方法時(shí),帶_
的實(shí)例變量需要我們手動(dòng)通過(guò)synthesize
來(lái)合成揉抵。 - 使用了
@dynamic
時(shí) - 協(xié)議中的屬性
- category中的屬性
- 重載的屬性
下面來(lái)分別說(shuō)明
協(xié)議中的屬性
協(xié)議中定義了屬性亡容,協(xié)議中定義了屬性其實(shí)也就是定義了該屬性的getter和setter方法,但是并沒(méi)有該方法的實(shí)現(xiàn)冤今。
所以在遵守該協(xié)議的類中應(yīng)該實(shí)現(xiàn)對(duì)應(yīng)的getter和setter方法闺兢。可以直接通過(guò)synthesize
關(guān)鍵字來(lái)自動(dòng)生成戏罢。
@dynamic
用property
會(huì)自動(dòng)的添加synthesize
,而synthesize
的作用是自動(dòng)生成getter和setter屋谭,并且定義一個(gè)帶下劃線的實(shí)例變量
而 dynamic
關(guān)鍵字則會(huì)阻止自動(dòng)生成getter和setter方法和生成變量
@interface model
@property (nonatomic, strong) NSString *str;
@end
@implementation
@dynamic str;
@end