OC中我们通过@property定义属性
@interface People : NSObject
@property (nonatomic, assign) NSInteger age;
- (void)changeAge:(NSInteger)age;
@end
@implementation People
//重写set方法,为了更方便分析代码实现的过程
- (void)setAge:(NSInteger)age
{
if (_age != age) {
_age = age;
NSLog(@"age Setter 方法被访问");
}
}
- (void)changeAge:(NSInteger)age
{
_age = age;
}
@end
当我们访问变量的时候,可以通过self.xxx 和 _xxx 的方式调用,那么这两种方式有什么区别呢?我们一起来看一下
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
从上述中我们可以发现,_xxx的方式是直接访问实例变量,然后进行操作。self.xxx的方式,是通过系统的get方法获取,或者通过set方法进行赋值操作。
理论上来讲使用self.xxx访问速度要比_xxx慢,不过我们在实际使用的时候,要根据情况选择。
1、是否重写了set方法
2、是否使用了“懒加载”(重写get方法)
2、是否使用了“键值观测”(KVO)
在Effective Objective-C2.0中,作者建议内部访问时,尽量用_xxx的方式访问。不过我觉得使用self.xxx方式调用更能统一代码风格,以及避免上述问题。毕竟作者当时考虑时基于的硬件设备性能较差。