【问题标题】:Use property in class extension instead of ivar in post ARC在 ARC 后使用类扩展中的属性而不是 ivar
【发布时间】:2014-07-14 01:08:47
【问题描述】:

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

除了作为推荐做法之外,使用 ivar 而不是属性的人的主要缺点是什么?我试图说服一些人进行转换,但有些人认为 ivar 的工作效果同样好且速度更快。所以我想收集好的扎实的论据,而不是给出诸如“它更好、更一致等”之类的软性陈述。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

    HTH

    【讨论】:

    • 根据 Apple 的封装文档推荐做法。 “在需要跟踪值或另一个对象时,最好在对象上使用属性”。这是过时的,还是不是指“私人”财产?
    • 该参考文献主要是关于 封装,之前它说“鉴于面向对象编程的主要原则之一是对象应该隐藏其内部工作原理公共接口,重要的是使用对象公开的行为访问对象的属性,而不是尝试直接访问内部值。”它不排除私有属性,但确实涵盖了在 @implementation 中声明实例变量,这是 Obj-C after 属性中引入的一个特性...
    • 感谢您的澄清 :)
    【解决方案2】:

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

    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。如果其中任何一个可能适用于类的生命周期,请使用私有属性。

    【讨论】:

    • 只是想评论一下,如果您将weakSelf 转换为strongSelf,您可以通过strongSelf->_someIvar 设置Ivar。
    • 我没有考虑过的优秀建议。谢谢。
    • @rmaddy,是否需要 KVO 私有财产?
    • 可能不需要 KVO,但可能需要知道值何时更改,最好使用私有属性的自定义设置器来完成。
    • 因此可以争辩说,当需要 KVO 时,请使用属性而不是 ivar。对于正常使用,ivar 就可以了,对吗?
    【解决方案3】:

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

    【讨论】:

    • 是否需要 KVO 私有财产?另外,假设您不需要自定义行为,为什么还需要 setter/getter?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多