【问题标题】:Using property accessors on viewDidLoad - Objective C在 viewDidLoad 上使用属性访问器 - Objective C
【发布时间】:2016-06-29 10:35:15
【问题描述】:

据我所知,您应该始终使用访问器来访问或修改属性,但以下两种情况除外:

  • 初始化
  • dealloc

不要在初始化方法和 dealloc 中使用访问器方法 唯一的 不应该使用访问器方法来设置实例变量的地方 在初始化方法和dealloc中。初始化计数器对象 使用表示零的数字对象,您可以实现一个 init。

此异常是因为在视图未完全初始化时调用访问器可能会在覆盖 setter/getter 时引发问题 (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html)

因此,根据这一点,在viewDidLoad 上使用访问器应该非常好,甚至被推荐,但是在互联网上的大多数可用代码中,开发人员在viewDidLoad 上使用_ivars,我想知道为什么。在viewDidLoad 中使用属性_ivars 而不是访问器是否有理由?

【问题讨论】:

    标签: ios objective-c properties accessor viewdidload


    【解决方案1】:

    关于在 init/dealloc 方法中使用访问器的最有价值的帖子之一 https://www.mikeash.com/pyblog/friday-qa-2009-11-27-using-accessors-in-init-and-dealloc.html

    【讨论】:

    • 这篇文章只是解释了我已经说过在 init 和 dealloc 上使用访问器的内容,它没有回答我的问题。
    • 使用属性的一些好处:可以在getter/setter方法上设置断点,覆盖getter/setter方法。
    • 还有ivars的好处:你可以将它用作@public、@protected、@private,比property更容易
    • 我的意思是来自属性的_ivars,而ivars 的好处并不能解释为什么只在viewDidLoad 上使用它们。我的问题是为什么要使用 viewDidLoad 中的属性 _ivars 而不是像任何其他方法一样使用访问器(initdealloc 除外)
    • 我还在viewDidLoad 的github use 属性中发现了很多代码。我认为这取决于开发人员。
    【解决方案2】:

    您应该始终使用访问器来访问或修改属性

    你在哪里读到的?

    当你想访问一个属性时,你可以使用_ivar(或self->_ivar)直接访问实例变量,不经过getter,解析和执行getter会更快。 但是,如果您使用自定义 getter,则不会执行。

    【讨论】:

    • Apple 文档指定 Use Accessor Methods to Set Property Values
    • 是的,但这不是强制性的,您可以同时使用这两种方法,但访问器方法更容易进行内存管理。例如,如果您使用copy 属性设置属性,则直接设置 ivar 不会复制,因为它是 setter 的角色。
    • 另外,在带有 retain 属性的 ARC 之前,您需要在设置它之前/之后释放/保留您的 ivar。但是对于 ARC,这不再是一个问题,设置一个强大的 ivar 将自动释放/保留它
    【解决方案3】:

    通常会重写属性访问器来更新视图,如果视图尚不可见,这是低效的。因此,您发现 ivar 的代码可能直接使用它来防止这种情况发生。但是,更好的是使用该属性,但检查视图是否可见并且仅在必要时更新。可以从viewWillAppear 调用相同的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2013-05-27
      • 1970-01-01
      相关资源
      最近更新 更多