setter/getter方法 與 @proterty
(一)點語法的本質(zhì)
點語法的本質(zhì)是方法的調(diào)用,當(dāng)使用點語法時,編譯器會自動將其轉(zhuǎn)化為setter/getter方法,如果沒有setter和getter方法,就不能使用點語法.
(二)點語法使用時的注意事項
以下這種方式是一個死循環(huán):
(1)在setter方法中,self.weight = weight; 相當(dāng)于[self setWeight:weight];
(2)在getter方法中,return self.weight ; 相當(dāng)于[self weight];
(三)@property 與 @synthesize關(guān)鍵字的作用
(1)@property 關(guān)鍵字
@property 關(guān)鍵字 可以自動生成某個實例變量(成員變量)的setter和getter方法的聲明.
例:
@property float weight;
編譯時遇到這行代碼,會自動擴(kuò)展為以下兩句:
-(void)setWeight:(float)weight;
-(float)weight;
(2)@synthesize 關(guān)鍵字
@synthesize 關(guān)鍵字 可以自動生成某個實例變量(成員變量)的setter和getter方法的實現(xiàn).
例:
@synthesize weight = _weight;
//左邊的weight 代表實現(xiàn)@property float weight
//右邊的_weight 代表_weight這個實例變量
編譯時遇到這行代碼,會自動擴(kuò)展為以下代碼:
- (void)setWeight:(float)weight
{
_weight = weight;
}
- (float)weight
{
return _weight;
}
(四)關(guān)鍵字使用時的注意事項
(1)從Xcode4.4之后,@property關(guān)鍵字獨攬了三個功能,這三個功能分別是:
1)生成_weight實例變量的get和set方法的聲明;2)生成_weight實例變量set和get方法的實現(xiàn);3)生成一個_weight的實例變量。
相當(dāng)于獨攬了@property和@synthesize的功能.
2)重寫setter/getter方法(手寫實現(xiàn)):
1)如果手動實現(xiàn)了set方法,那么編譯器就只生成get方法和實例變量;
2)如果手動實現(xiàn)了get方法,那么編譯器就只生成set方法和實例變量;
3)如果set和get方法都是手動實現(xiàn)的,那么編譯器將不會生成實例變量。
(五)nonatomic 與 atomic(了解)
(1)nonatomic 與 atomic用來決定編譯器生成的setter和getter方法是否為原子操作.
(2)atomic:是一種線程保護(hù)技術(shù),提供線程安全.是為了防止在寫未完成的時候,就被另外一個線程讀取,從而造成數(shù)據(jù)的錯誤.但是這種機(jī)制耗費系統(tǒng)資源.
nonatomic:如果對象不用考慮多線程的情況,那么就可以使用nonatomic,可以提高執(zhí)行效率.
(3)在多線程環(huán)境下,原子操作是必要的,否則可能引起錯誤的結(jié)果.