主要有兩個方面的區(qū)別:
1、self.XXX是通過set和get方法對屬性的間接訪問,會使引用計數(shù)加一,而_XXX是直接獲取局部成員變量(實例變量是成員變量的一部分),不包含set和get方法。
2、self.XXX是對屬性的間接訪問,而_XXX是對成員變量的直接訪問。
【注意】使用self.XXX是更好的選擇,因為這樣可以兼容懶加載,同時也避免了使用下劃線時忽略了self這個指針,self.容易在Block中造成循環(huán)引用(Block是個獨立的運行單元,block中的self是強引用,例如加載完數(shù)據(jù)在block中使用self.tableView reloadData,會出現(xiàn)循環(huán)引用內(nèi)存泄漏,可以定義__weak typeof(self) weakSelf = self,用weakSelf弱引用代替self強引用從而避免循環(huán)引用問題。同時,使用下劃線是獲取不到父類的屬性,因為它只是對局部變量的訪問。)
此外,再做一下延伸和擴展。
(1)成員變量和實例變量有何區(qū)別?
下面先看下成員變量的聲明方法:
@interface MyObject : NSObject {
NSString *a;
NSInteger b;
}
@end
以上聲明方法的花括號中的NSString*a和NSInteger b都是成員變量,但二者又有區(qū)別。成員變量a是一個對象指針(因為其前面帶星號),故a又被稱為實例變量。而成員變量b不是實例變量。簡言之,實例變量是成員變量的子集。
(2)屬性和成員變量有何區(qū)別?
屬性就是通過@property聲明的變量。區(qū)別有以下幾點:
1)與成員變量不同的是,屬性添加了存取方法,即setter和getter方法(Xcode編譯器通過@synthesize自動添加);
2)屬性默認會生成帶下劃線的成員變量;
參考文章:
http://m.itdecent.cn/p/6ca11cbe4187
http://m.itdecent.cn/p/167688b5a9f8