【发布时间】:2012-03-26 17:02:20
【问题描述】:
在非 ARC 代码中,保留属性使用 self.property = 语法轻松地为您处理内存管理,因此我们被教导将它们用于几乎所有事情。
但是现在有了 ARC,这种内存管理不再是问题,那么使用属性的理由是否消失了?还有什么好的理由(显然除了提供对实例变量的公共访问之外)再使用属性吗?
【问题讨论】:
标签: objective-c ios xcode automatic-ref-counting
在非 ARC 代码中,保留属性使用 self.property = 语法轻松地为您处理内存管理,因此我们被教导将它们用于几乎所有事情。
但是现在有了 ARC,这种内存管理不再是问题,那么使用属性的理由是否消失了?还有什么好的理由(显然除了提供对实例变量的公共访问之外)再使用属性吗?
【问题讨论】:
标签: objective-c ios xcode automatic-ref-counting
但现在有了 ARC,这种内存管理不再是问题,所以 使用属性蒸发的原因?还有什么好的吗 原因(显然不是提供对实例的公共访问 变量)来使用属性了吗?
是的——通过使用@property 和@synthesized getter/setter,您保证:
即使在类内部,我通常也倾向于使用属性和点语法来维护对象内的状态。这并不是普遍正确的——如果我的设计是这样的,那么我会直接操纵一些实例变量(完全直接操纵;根本没有@property),如果我的设计暴露意味着无论如何都要进行大规模的重构。
【讨论】:
那么使用属性的原因就消失了吗?
随着 ARC 为 ivars 提供“所有权魔法”,人们选择属性而不是 ivars 的这一特定方面确实消失了。但是,还有许多其他人:
我继续使用属性作为保持可能暴露给外部类或内部“兄弟”类的状态的默认方式,因为额外的灵活性超过了运行时的小额额外成本。
【讨论】:
我不认为我曾经仅仅因为内存管理而使用过属性,我认为你也不应该这样做。所以要回答你的问题,不,除了访问实例变量之外,没有理由使用属性,这本质上是它们应该首先用于的目的。
【讨论】:
你在谈论两个不同的事情。 ARC 用于管理内存,因此您不必背负大量的 dealloc 和 retain 语句。
属性可以让类有机会控制/限制其内部 iVar 的公开,公开 API 以供其他类进行通信/交互。
【讨论】:
除了保留之外,还有其他修饰符有时会变得非常有用,例如'copy' 将块分配给类成员变量时,或 'readonly' 确保无法写入属性。另外不要忘记使用 Core Data 时的“dynamic”属性,以及在分配或检索属性时执行自定义代码的可能性(在定义自定义 getter/setter 而不是使用@synthesize 时)。
【讨论】: