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