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

self.xxx与_xxx的区别

作者: 337b94dc718f | 来源:发表于2016-08-01 16:48 被阅读151次

    self.xxx(属性)

    属性定义如下,在头文件中定义则为公有属性,可以在其他文件中访问。在实现中定义则为私有,只能在.m文件中访问。
    @property (nonatomic, copy) NSString *name;
    属性可以使用点语法,如
    self.name = @"pingping";
    相当于调用实例方法,getter方法
    NSString *name = self.name;
    相当于调用实例方法,setter方法

    _xxx (实例变量)

    • Objective-C原则上不允许从对象外访问对象的实例变量的。
      @interface People : NSObject {
      NSUInteger age;
      NSString *name;
      }
    • 当上述实例变量定义在头文件中,默认可视性是@protected,可以在类、子类、同一类型的其他实例中访问,如people->age。若要改变访问权限,可通过@private、@public指定。
    • 当上述实例变量定义在实现文件中,则对外部不可见,封装层次更高,但是在同类的实例中仍可通过->访问到。但是在子类中访问不到父类的实例变量。

    属性与实例变量的联系

    从iOS5开始,当在头文件中声明一个属性后,如name,编译器会自动在实现文件中生成实例变量_name,而且不需要使用
    @synthesize name = _name;
    大部分情况下,_xxx或self.xxx达到的效果是一样的,但还是有部分情况需要特别注意。接着往下看。

    踩过的坑

    1.懒加载时,如果不使用self.xxx是无法调用getter方法的,所以此时懒加载根本没用上,你的指针都是nil的状态。
    2.要是用copy修饰属性,当使用_xxx语法时,是直接操作的原对象地址,不会触发copy操作,若你赋值的对象被修改了,那么你的属性值也被修改了。
    3.在初始化init以及dealloc的方法中,可以使用_xxx语法,但在其他情况
    下使用self.xxx比较合理
    4.在dealloc方法中,若要使用部分属性,最好使用_xxx方式,若是该属性是懒加载而你用点语法访问,会造成crash。

    参考

    iOS 中关于self.xxx和_xxx访问变量的区别
    iOS之self.xxx与_xxx的区别

    相关文章

      网友评论

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

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