開宗明義:object-c實例變量不完全等同于@property語法定義的property變量
相信大家在定義ios類的時候都會習慣性地使用類似@property (nonatomic,strong) NSObject ab; 的代碼定義實例變量,但這里需要注意的是,自從@property能夠不在配套的@synthesize語法的協(xié)助下就可以自動幫你定義setter和getter方法之后餐塘,apple就試圖讓你相信瞧捌,使用@property就是在單純地定義了一個實例變量。
眾所周知,在oc對象定義的方法中訪問實例變量的語法是在property語法定義的變量名前加下劃線。而且你應該也知道在setAb方法中再調(diào) self.ab = something是會引起死循環(huán)的,所以你只能寫成這樣_ab = something這才能萬事大吉檬贰,憑什么你辛辛苦苦定義的實例變量卻一定要冠上別人的姓再去訪問才能成功呢?
@property語法定義出來的實例的成員變量(apple官方文檔稱之為ivars)是property名前冠以下劃線為變量名定義的
可以看出使用synthesize語法時缺亮,如果定義有同名的實例變量時偎蘸,在對象其他方法中可以直接使用定義的實例變量來訪問及修改數(shù)據(jù)。對于@property自動合成的accessor方法則會自動定義將property名前加下劃線的實例變量瞬内。
使用self.property形式訪問及修改數(shù)據(jù)是通過accessor方法來完成對真正的實例變量操作的
需要記住的是就算在這種實例變量名與property名相同的情況下迷雪,使用self.title 形式試圖訪問及修改實例變量 其實也是經(jīng)過了accessor方法中轉(zhuǎn)來完成的,即訪問的時候會調(diào)用getter方法來獲取真正的實例變量虫蝶,修改的時候會調(diào)用setter方法章咧。而直接訪問及修改的方式是使用title,而非property語法自動合成accessor方法時會自動定義的_title形式能真。
同時有國際友人發(fā)現(xiàn)赁严,使用accessor方法才會增加引用計數(shù)而直接使用實例變量不會增加引用計數(shù)的情況,在親自測試過后發(fā)現(xiàn)最新的xcode(6.3)及sdk(8.3)是沒有這種情況的粉铐,所以就算是有真的有這種情況出現(xiàn)疼约,應該也是曾經(jīng)的bug,現(xiàn)在大家可以放心地使用的。