參考:https://blog.csdn.net/u013378438/article/details/44200917
https://blog.csdn.net/aaidong/article/details/46998481
https://blog.csdn.net/lichuanlong007/article/details/52209173
目前@property 屬性變量有兩種調(diào)用方式色瘩,self.a和_a兩種方式。
例子
例如:test的聲明如下:
@interface?Test:NSObject??
@property?int?a;??
-(void)?changeAValue:(int)?newValue;??
@end??
在類的實例方法中跪楞,我們可以用下面兩種方式來訪問a屬性:
1萄窜、直接用屬性名訪問:
[objc]
-(void)?changeAValue:(int)?newValue??
{??
????_a?=?newValue;??//?默認生成的屬性成員變量前面會自動加上“_”前綴??
}??
2熙尉、通過self.a的形式訪問
[objc]
-(void)?changeAValue:(int)?newValue??
{??
????self.a?=?newValue;??
}??
方法對比
1. ?首先通過self. 通過訪問的方法的引用:包含了set和get方法。
但是,通過下劃線是獲取自己的實例變量,不包含set和get的方法账千。
2. @property
(nonatomic,copy) NSString *propertyName;
self.propertyName是對屬性的訪問汞贸;使用_propertyName是對局部變量的訪問绳军。
所有被聲明為屬性的成員,在iOS5
之前需要使用編譯器指令@synthesize來告訴編譯器幫助生成屬性的getter,setter方法矢腻。之后這個指令可以不用人為指定了门驾,默認情況下編譯器會幫我們生成。
編譯器在生成getter,setter方法時是有優(yōu)先級的多柑,它首先查找當前的類中用戶是否已定義屬性的getter,setter方法奶是,如果有,則編譯器會跳過竣灌,不會再生成聂沙,使用用戶定義的方法。
也就是說你在使用self.propertyName 時是在調(diào)用一個getter方法初嘹。
self.propertyName 會讓計數(shù)器+1;_propertyName卻不會及汉。_propertyName是類似于self->_propertyName。
3. 用self.propertyName 是更好的選擇屯烦,因為這樣可以兼容懶加載坷随,同時也避免了使用下劃線的時候忽視了self這個指針房铭,后者容易在block中造成循環(huán)引用。同時温眉,使用_是獲取不到父類的屬性育叁,因為它只是對局部變量的訪問。
4. self方法實際上是用了get和set方法間接調(diào)用芍殖,下劃線方法是直接對變量操作豪嗽。