OC中我們通過@property定義屬性
@interface People : NSObject
@property (nonatomic, assign) NSInteger age;
- (void)changeAge:(NSInteger)age;
@end
@implementation People
//重寫set方法澜薄,為了更方便分析代碼實(shí)現(xiàn)的過程
- (void)setAge:(NSInteger)age
{
if (_age != age) {
_age = age;
NSLog(@"age Setter 方法被訪問");
}
}
- (void)changeAge:(NSInteger)age
{
_age = age;
}
@end
當(dāng)我們?cè)L問變量的時(shí)候罕袋,可以通過self.xxx 和 _xxx 的方式調(diào)用笼平,那么這兩種方式有什么區(qū)別呢掌逛?我們一起來看一下
People * man = [People new];
NSLog(@"111111111");
man.age = 1;
NSLog(@"222222222");
[man changeAge:2];
NSLog(@"33333333");
2017-01-13 17:12:15.109 OCProrerty[18659:6754487] 111111111
2017-01-13 17:12:15.110 OCProrerty[18659:6754487] age Setter 方法被訪問
2017-01-13 17:12:15.110 OCProrerty[18659:6754487] 222222222
2017-01-13 17:12:15.110 OCProrerty[18659:6754487] 33333333
從上述中我們可以發(fā)現(xiàn),_xxx的方式是直接訪問實(shí)例變量壁袄,然后進(jìn)行操作类早。self.xxx的方式,是通過系統(tǒng)的get方法獲取嗜逻,或者通過set方法進(jìn)行賦值操作涩僻。
理論上來講使用self.xxx訪問速度要比_xxx慢,不過我們?cè)趯?shí)際使用的時(shí)候,要根據(jù)情況選擇逆日。
1嵌巷、是否重寫了set方法
2、是否使用了“懶加載”(重寫get方法)
2室抽、是否使用了“鍵值觀測(cè)”(KVO)
在Effective Objective-C2.0中搪哪,作者建議內(nèi)部訪問時(shí),盡量用_xxx的方式訪問狠半。不過我覺得使用self.xxx方式調(diào)用更能統(tǒng)一代碼風(fēng)格噩死,以及避免上述問題颤难。畢竟作者當(dāng)時(shí)考慮時(shí)基于的硬件設(shè)備性能較差神年。