美文网首页
iOS self.xxx 和 _xxx 的区别

iOS self.xxx 和 _xxx 的区别

作者: zhangbo1992 | 来源:发表于2017-06-26 15:38 被阅读0次

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方式调用更能统一代码风格,以及避免上述问题。毕竟作者当时考虑时基于的硬件设备性能较差。

相关文章

网友评论

      本文标题:iOS self.xxx 和 _xxx 的区别

      本文链接:https://www.haomeiwen.com/subject/nxusbttx.html