There are some benefit of using variables? Or it is OK to use property instead of variable?
2 回答
在许多情况下使用属性而不是实例变量不仅可以,而且通常是首选。
在 ARC 出现之前,属性(或通常的访问器)的一个重要方面是它们通过减少需要保留或释放对象的位置数量来简化内存管理。现在我们有了 ARC,这并不那么重要,但它提供了一些背景,说明为什么有些人几乎在所有地方都选择属性而不是 ivars。选择属性的其他原因包括键值观察、访问对象状态的一致语法、描述属性语义的简明方式以及通过封装确保未来。
有一种想法是访问器函数通过暴露对象的内部工作来打破封装,我认为这通常是人们选择使用 ivars 而不是属性的原因。不过我不同意:您始终可以将属性隐藏在类扩展中,以便它们仅对类可见,并且在任何情况下访问器都允许您更改实现,同时仍提供相同的接口。在任何情况下,如果您不希望您的类的用户依赖给定的属性,您可以将其设为 ivar,也可以将其设为在类扩展中声明的属性。
ivars 的另一个论点是速度——直接使用变量可以避免调用访问器方法。IMO,属性的其他好处通常远远超过任何速度优势。如果在特定情况下访问器调用是一个真正的问题,通常有比避免属性更好的方法来解决问题。
这个问题有点奇怪,因为默认情况下,所有属性都会产生实例变量。因此,仅使用 ivars 而不是属性没有任何好处。
如果有的话,属性比 ivars 有很多好处。属性提供封装、内存管理(在使用 MRC 时最相关)和 KVO。
在属性上使用普通 ivar 唯一可能的好处是效率低。直接访问 ivar 的开销比访问属性(实际上是一个方法调用)要少。但除非你已经衡量了性能问题,否则房产的好处超过了这一点。
这里更重要的问题是您是否公开了所有属性。您的 .h 文件应该只列出公共属性(其他类需要的)和公共方法声明。.m 文件中的所有其他内容都应该是私有的。在 .m 文件的类扩展中声明所有私有属性。