使用ARC为什么再使用@properties?

tra*_*per 12 xcode objective-c ios automatic-ref-counting

在非ARC代码中,保留属性可以使用self.property =语法轻松地为您处理内存管理,因此我们被教导将它们用于几乎所有内容.

但是现在使用ARC,这种内存管理不再是一个问题,使用属性的原因是否会消失?有没有什么好的理由(显然除了提供对实例变量的公共访问权限)才能再使用属性?

bbu*_*bum 31

但是现在使用ARC,这种内存管理不再是一个问题,使用属性的原因是否会消失?有没有什么好的理由(显然除了提供对实例变量的公共访问权限)才能再使用属性?

是的 - 通过使用@property和@synthesized getters/setter,您可以保证:

  • 您的getter/setter可以是子类,子类可以覆盖存储和/或行为
  • 一切都保持良好的封装
  • 您可以使用观察挂钩 - KVO等... - 来监控内部和外部的变化
  • 您有一个方便的位置来设置读取和/或写入属性的断点
  • 如果需要公开"仅内部"实例变量,则需要复制@property声明本身; 更少的重构.
  • 你可以利用所有各种修饰符关键字的声明能力 - 复制,强,弱,原子等. - 编译器越来越多地利用它们的优势

即使是内部的类,我通常倾向于使用属性和点语法来维护对象内的状态.这并非普遍适用 - 如果我的设计是暴露意味着无论如何都会进行大规模的重构,那么我会直接操作一些实例变量(完全直接操作;根本没有@property).

  • 此外,属性还使添加复制语义和原子语义更容易,更安全.另外使用@synthesize propname = ivarname创建一个具有一个名称和一个实例变量的属性.总是有用的. (6认同)

das*_*ght 6

那么使用属性的原因是什么?

随着ARC为ivars提供"所有权魔力",为什么选择属性而非ivars的这个特殊方面确实会消失.但是,还有许多其他人:

  • 原子/非原子区分可用于属性,而不适用于ivars
  • 属性提供的灵活性(readonly/read + write区分)不适用于ivars
  • 执行计算和参数检查的能力不适用于ivars

我继续使用属性作为保持可能暴露给外部类或内部"兄弟"类的状态的默认方式,因为额外的灵活性超过了运行时的额外成本.