在类扩展中使用属性,而不是在ARC后使用ivar



建议在ARC后环境中使用属性,包括通过类扩展的私有属性,而不是ivar (init和dealloc除外)。

除了作为推荐的实践之外,使用ivar而不是property的主要缺点是什么?我试图说服一些人进行转换,但有些人认为ivar工作得一样好,而且更快。所以,我更愿意收集有力的论据,而不是软性陈述,比如"这样更好、更一致等等"。

你的问题没有正确答案,只有观点。所以你会得到不同的答案,这里有一个可以添加到你的收藏中:-)

不推荐使用私有属性,这在很大程度上是一种时尚。: -)

公共属性是类封装的一部分——如何实现属性(或方法)与用户无关,只与行为有关。

一个类不需要隐藏它是如何实现的!

所以私有属性的唯一用例是它们以一种方便的方式为类的实现提供一些行为,而不是隐藏这些行为。

如果类从另一个类获取可变字符串,并且需要保留它们的当前值,那么带有copy属性的私有属性可能是方便的。

如果类希望在需要时惰性构造一个值,但在此之后保留该值,则属性可以方便地处理该问题。当然,方法或函数可以和属性一样,毕竟只是一个方法调用。

为了做出选择,考虑便利性/代码设计,而不是像对公共属性那样进行封装。大多数情况下,你可能只会使用实例变量,就像你只使用局部变量一样。

HTH

在性能方面没有太大区别。实际上,属性是带有生成的访问器的实例变量。你想要做属性的原因是因为生成KVO通知和setter/getter方法的代码是生成给你的。

在一些情况下,使用私有属性比使用实例变量更好或更有必要:

  1. KVO -由于KVO需要getter/setter方法来完成工作,因此您需要一个属性(技术上只是方法)。在私有属性上使用KVO可能不太常见。
  2. 延迟加载或其他"业务逻辑"的值。使用带有自定义setter/getter方法的属性允许你对值应用延迟加载和/或其他逻辑/验证。
  3. 使用弱引用访问块中的值。
最后一点最好用一个例子来说明。正如许多人所知道的,在某些条件下,您可以在块中创建一个引用循环,并且可以使用对self的弱引用来打破这个循环。问题是你不能使用弱引用访问ivar,所以你需要一个属性。
__weak typeof(self) weakSelf = self;
[self.something someReferenceCycleBlock:^{
    weakSelf->_someIvar = ... // this gives an error
    weakSelf.someProperty = ... // this is fine
}];

基本上,如果这些点都不适用,则使用ivar。如果这些属性中的任何一个可能在类的生命周期内应用,请使用私有属性。

最新更新