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

时间:2014-05-24 22:11:15

标签: objective-c properties automatic-ref-counting ivar

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

除了推荐的做法之外,使用ivar代替财产的人有哪些主要缺点?我试图说服一些人进行转换,但有些人认为ivar的工作原理也一样快。所以我想收集好的可靠论据,而不是给出诸如“更好,更一致等等”的软性陈述。"

3 个答案:

答案 0 :(得分:1)

你的问题没有正确答案,只有意见。所以你会得到不同的答案,这是一个添加到你的收藏: - )

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

公共属性是类的封装的一部分 - 实现的属性(或方法)与用户无关,只与行为相关。 / p>

一个类不需要隐藏它自己的实现方式!

因此,私有属性的唯一用例是它们以方便的方式提供某些行为来实现类,而不是隐藏该行为。

如果类是从另一个类获取可变字符串并且需要保留其当前值,则具有copy属性的私有属性可能很方便。

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

选择思考方便/代码设计而不是封装,就像对公共属性一样。大多数情况下,你可能只是使用实例变量,就像你只使用局部变量一样。

HTH

答案 1 :(得分:0)

在性能方面没有太大差异。实际上,属性是生成访问器的实例变量。因此,您想要执行属性的原因是因为生成KVO通知的代码和setter / getter方法是为您生成的。因此,您可以减少在所有类上重复编写代码的时间。

答案 2 :(得分:0)

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

  1. KVO - 由于KVO需要getter / setter方法来完成工作,因此您需要一个属性(技术上只是方法)。在私有财产上使用KVO可能并不常见。
  2. 延迟加载或围绕值的其他“业务逻辑”。使用具有自定义setter / getter方法的属性允许您在值周围应用延迟加载和/或其他逻辑/验证。
  3. 使用弱引用访问块内的值。
  4. 最后一点最好用一个例子来说明。正如许多人所知,在某些条件下,您可以在块中创建引用循环,这可以使用对self的弱引用来打破。问题是您无法使用弱引用访问ivar,因此您需要一个属性。

    __weak typeof(self) weakSelf = self;
    [self.something someReferenceCycleBlock:^{
        weakSelf->_someIvar = ... // this gives an error
        weakSelf.someProperty = ... // this is fine
    }];
    

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