【问题标题】:Usefulness of using properties for IBOutlets under ARC?在 ARC 下使用 IBOutlets 的属性有用吗?
【发布时间】:2011-10-18 22:09:05
【问题描述】:

在 ARC 下,将每个 IBOutlet 设为属性有什么意义?将 ivars 用于仅由视图控制器在内部使用的 IBOutlets 会有什么缺点?

【问题讨论】:

  • 你认为为什么必须创建属性?
  • @Phlibbo:我一直在这里和那里看到它是“好的做法”并简化了 viewDidUnload 代码。
  • 我希望有一本类似于 Scott Meyers 和 Herb Sutter 为 C++ 编写的“有效 iOS”书。

标签: iphone objective-c ios automatic-ref-counting


【解决方案1】:

如果您不对任何事情使用 setter/getter 方法,不要依赖于这些属性的键值观察,并且不要期望子类会从覆盖这些属性中受益,那么就没有真正的缺点仅将 ivars 用于 ARC 下的 IBOutlets。

【讨论】:

  • 谢谢,ivars 将在我的代码中消除很多 self. 前缀。
  • 请查看我的回答,如果您对正在发生的事情有任何见解,请告诉我。
【解决方案2】:

我一直在为我的“私有”IBOutlets 使用 ivars,但遇到了内存泄漏问题。我认为这是因为我的 IBOutlets 使用了__unsafe_unretained 属性而不是__weak。我不能使用__weak,因为它在 iOS 4 上不受支持(我希望我的应用程序向后兼容 iOS 4)。很难掌握 ARC、IBOutlets、viewDidUnload 以及所有这些混乱中真正发生的事情。叹息……

无论如何,当我将 IBOutlets 从 ivars 更改为属性时,内存泄漏问题就消失了。

所以,回答我自己的问题,将 ivars 用于 IBOutlets 的一个缺点是,如果您有 __unsafe_unretained 属性,您可能会遇到内存泄漏。

【讨论】:

  • 这不太可能是您的泄漏源。如果您的出口是__unsafe_unretained,那么根据定义,这些 ivars 没有保留他们的目标,并且 不保留 某些东西永远不会导致泄漏。 (这可能会导致崩溃,但那是另一回事了。)您没有指定您添加的属性是否同样是 unsafe_unretained,但无论哪种方式,您唯一可以通过添加属性来做的事情就是导致 more 保留。没有更多细节,就不可能说出你为什么泄漏。如果你真的很好奇,你可以提交另一个问题。
  • 我添加的属性确实是unsafe_unretained。我真的很困惑为什么将 IBOutlets 从 ivars 更改为属性会有所不同。也许我没有正确解释 XCode 的 Instruments。
  • unsafe_unretained 可能会导致崩溃,但不会导致泄漏。我会说你对仪器的解释是错误的。对不起。 :) 话虽如此,现在已经过去好几个月了:您对正在发生的事情有什么额外的了解吗?
  • 我已经升级到 iOS 5(放弃了对 iOS 4.x 的支持),所以我不再使用 unsafe_unretained。我没有尝试将我的IBOutlet 属性改回ivars,所以我不知道原来的问题是否仍然存在。
  • 我们遇到了完全相同的问题。我们将 IBOutlets 作为具有 unsafe_unretained 的 ivars,并且我们有一个内存泄漏,最终会导致应用程序崩溃。如果我们以 iOS 5 为目标并将它们更改为弱,那很好。我们最终将它们移至具有 unsafe_unretained 的属性,现在可以了。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2016-05-06
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多