【问题标题】:IBOutlets Strong or Weak - Does it Actually Make a Difference to Memory Management? (ARC)IBOutlets 强或弱——它实际上对内存管理有影响吗? (弧)
【发布时间】:2014-03-16 14:46:09
【问题描述】:

我最近在这里和其他网站上阅读了很多关于 IBOutlets 应该强还是弱的信息。官方的判断是它们应该是弱的,除非它们引用顶级 xib 对象。

这很好。

但是我还没有清楚地理解为什么将它们设置为强或弱实际上会对应用程序的内存管理产生影响。特别是从 iOS6 开始,viewDidUnload 似乎不再在收到内存警告时被调用,所以从这个意义上说,IBOutlets 的弱或强选择没有任何区别。

我是否认为对于不再位于导航堆栈上的视图控制器(即在它们被加载然后弹出之后),任何声明为弱的 IBOutlets 都会被释放?

感谢您的任何见解!

【问题讨论】:

  • 一般来说,如果出口 weak 已经有静态 superview,则保留它们(这会使视图保持活动状态,直到它们成为视图层次结构的一部分并且不会导致强保留周期),如果任何视图被添加到任何 view 或从 strong 引用中删除,最好确保视图保持活动状态,直到您最终想要释放它。

标签: ios objective-c memory-management ios7 iboutlet


【解决方案1】:

IBOutlets 可以声明为弱,因为它们将在 XIB 解析期间创建并添加到 UIView 堆栈中......因此您不需要对该对象的强引用。

当你声明一个 IBOutlet 弱时,你确保当 UIViewcontroller 的主 UIView 消失时,每个子视图都将被删除而没有任何内存泄漏。

【讨论】:

  • 这是我感兴趣的 - 所以将它们设置为 weak 将允许在拥有视图不再存在时删除子视图?
  • 是的,因为代码中唯一(强)引用是在他的 superview 上。
【解决方案2】:

您可能已经注意到,当您直接从 Interface Builder 插入 IBOutlet 时,您可以选择将其作为弱属性还是强属性。在 Apple 开发人员的库中进行了一些搜索后,我发现何时应该使用其中一个:

出口通常应该是弱的,除了从文件所有者到 nib 文件中的顶级对象(或者,在 iOS 中,故事板场景)应该是强的。因此,您创建的 Outlets 通常应该是弱的,因为:

例如,您为视图控制器的视图或窗口控制器的窗口的子视图创建的 Outlets 是对象之间的任意引用,并不暗示所有权。 强插座经常由框架类指定(例如,UIViewController 的视图插座,或 NSWindowController 的窗口插座)。

more

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多