美文网首页
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