Objective c 有了ARC,为什么还要使用@properties?
在非ARC代码保留属性中,可以使用Objective c 有了ARC,为什么还要使用@properties?,objective-c,ios,xcode,automatic-ref-counting,Objective C,Ios,Xcode,Automatic Ref Counting,在非ARC代码保留属性中,可以使用self.property=语法方便地为您管理内存,因此我们被教导在几乎所有情况下都使用它们 但是现在有了ARC,内存管理不再是一个问题,使用属性的原因也就消失了吗?还有什么好的理由(显然不是提供对实例变量的公共访问)再使用属性吗?我认为我从来没有仅仅因为内存管理而使用过属性,我认为你也不应该这样做。所以要回答你的问题,不,除了访问实例变量之外,没有理由使用属性,这基本上就是它们应该首先使用的 但是现在有了ARC,内存管理就不再是问题了 使用属性的原因是什么?还
self.property=
语法方便地为您管理内存,因此我们被教导在几乎所有情况下都使用它们
但是现在有了ARC,内存管理不再是一个问题,使用属性的原因也就消失了吗?还有什么好的理由(显然不是提供对实例变量的公共访问)再使用属性吗?我认为我从来没有仅仅因为内存管理而使用过属性,我认为你也不应该这样做。所以要回答你的问题,不,除了访问实例变量之外,没有理由使用属性,这基本上就是它们应该首先使用的 但是现在有了ARC,内存管理就不再是问题了 使用属性的原因是什么?还有什么好的吗 原因(显然不是提供对实例的公共访问 变量)是否继续使用属性 是--通过使用@property和@synthesisted getter/setter,您可以保证:
- 您的getter/setter可以是子类,子类可以覆盖存储和/或行为
- 一切都很好地封装起来
- 您可以使用观察挂钩--KVO等--监控内部和外部的变化
- 您可以方便地在读取和/或写入属性时设置断点
- 如果需要公开“仅限内部”的实例变量,则需要复制@property声明本身;更不用说重构了
- 您可以利用所有各种修改器关键字的声明功能--复制、强、弱、原子等--编译器在这方面的优势越来越大
即使在类内部,我通常倾向于使用属性和点语法来维护对象内的状态。这并不是普遍正确的——如果我的设计是这样的,那么会有一些我直接操作的实例变量(完全直接操作;根本没有@property)。无论如何,暴露会意味着大规模重构。你说的是两件不同的事情。ARC用于管理内存,因此您不必为大量dealloc和retain语句所累
属性给类提供了控制/限制其内部IVAR暴露的机会,为其他类提供了一个与之通信/交互的API。除了保留之外,还有其他修饰符,有时可能会变得非常有用,例如将块分配给类成员变量时的“复制”,或“
readonly
”,确保属性无法写入。另外,在处理核心数据时,不要忘记“动态”
”属性,以及在分配或检索属性时(定义自定义getter/setter而不是使用@synthesis)执行自定义代码的可能性
那么,使用属性的原因是否消失了
随着ARC将“所有权魔法”提供给IVAR,人们为什么会选择房产而不是IVAR的这一特定方面确实消失了。然而,还有许多其他问题仍然存在:
- 原子/非原子区分适用于属性,而不适用于IVAR
- 属性(只读/读+写区别)提供的灵活性不适用于IVAR
- IVAR无法执行计算和参数检查
我继续使用属性作为保留状态的默认方式,这些状态可能会暴露给外部类或内部“同级”类,因为额外的灵活性超过了运行时的额外成本。此外,属性还使添加复制语义和原子语义更容易、更安全。另外,使用@synthesis propname=ivarname创建一个具有一个名称的属性和一个具有另一个名称的实例变量;总是有用的。同意,谢谢你的回答。我还想补充一点,关于@property performance与ivar的比较,有很多讨论。我敢说你会发现非原子性质和ivar之间的性能差异。。。它可能是不可测量的可忽略不计的。您是否也同意,修饰符关键字weak、strong、atomic等对于您的api以及arc本身来说都是有用的标志,可以帮助您理解您的意图?如果您没有使用属性,那么您可能是做错了。“有时可能看起来很乏味或迂腐,但如果您始终使用访问器方法,内存管理出现问题的可能性会大大降低。如果您在整个代码中使用retain和release on实例变量,则几乎可以肯定您做了错误的事。”—内存管理编程指南, Apple@DaveBatton那句话不适用于任何人ARC@JesseGumpo同意,它不适用于ARC。我打算用它来回应凯文的评论,他从来没有“仅仅因为内存管理而使用过属性…”