Objective c 在类扩展中使用属性,而不是在弧后使用ivar

Objective c 在类扩展中使用属性,而不是在弧后使用ivar,objective-c,properties,automatic-ref-counting,ivar,Objective C,Properties,Automatic Ref Counting,Ivar,推荐的做法是在后ARC环境中使用属性,包括通过类扩展而不是ivar(init和dealoc中除外)使用私有属性 除了推荐的做法外,使用ivar而不是财产的主要缺点是什么?我正试图说服一些人做出改变,但有些人认为ivar同样有效,速度更快。因此,我希望收集可靠的论据,而不是给出“更好、更一致等”之类的软陈述。性能方面没有太大差异。实际上,属性是生成了访问器的实例变量。因此,之所以要执行属性,是因为生成KVO通知和setter/getter方法的代码是为您生成的。因此,在所有类上执行重复代码的时间更

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


除了推荐的做法外,使用ivar而不是财产的主要缺点是什么?我正试图说服一些人做出改变,但有些人认为ivar同样有效,速度更快。因此,我希望收集可靠的论据,而不是给出“更好、更一致等”之类的软陈述。

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

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

  • KVO—因为KVO需要getter/setter方法来完成工作,所以您需要一个属性(技术上只是方法)。在私有属性上使用KVO可能不太常见
  • 延迟加载或围绕值的其他“业务逻辑”。通过将属性与自定义setter/getter方法一起使用,可以对该值应用延迟加载和/或其他逻辑/验证
  • 使用弱引用访问块内的值
  • 最后一点最好用一个例子来说明。许多人都知道,在某些情况下,可以在块中创建一个引用循环,使用对
    self
    的弱引用可以打破这个循环。问题是无法使用弱引用访问ivar,因此需要属性

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

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

    您的问题没有正确答案,只有您的意见。因此,您将得到各种各样的答案,这里有一个要添加到您的集合中:-)

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

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

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

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

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

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

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


    HTH

    是否需要对私有财产进行KVO?另外,假设不需要自定义行为,为什么需要setter/getter呢?根据苹果的封装文档,这是推荐的做法。“在需要跟踪某个值或另一个对象时,最好在对象上使用属性”。这是过时的,还是没有提到“私有”属性?这主要是关于封装的,前面提到过“鉴于面向对象编程的主要原则之一是对象应将其内部工作隐藏在其公共接口后面,因此使用对象公开的行为访问对象的属性,而不是试图直接访问内部值,这一点很重要。"它不排除私有属性,但包括在
    @实现中声明实例变量
    这是在属性之后引入Obj-C的一项功能…感谢您的澄清:)只是想说明一下,如果您将
    weakSelf
    转换为
    strongSelf
    ,您可以通过
    strongSelf->\u someIvar
    。我没有考虑过的好建议。谢谢。@rmaddy,是否需要对私有属性进行KVO?可能不需要KVO,但可能需要知道值何时更改,最好使用私有属性的自定义设置器。因此,有人可能会争辩说,当需要KVO时,请使用属性而不是ivar。对于正常使用,ivar很好,对吗?