IBOutlets强引用或弱引用 - 它是否对内存管理有实际影响?(ARC)

6
最近我在这里和其他网站上阅读了很多有关IBOutlets应该是强引用还是弱引用的文章。官方结论是它们应该是弱引用,除非它们引用顶层xib对象。
这没问题。
但是目前我还不清楚设置它们为强或弱实际上会如何影响应用程序的内存管理。特别是自iOS6以来,当接收到内存警告时,viewDidUnload将不再被调用,因此从这个意义上说,将IBOutlets设置为弱引用或强引用并没有区别。
但是,我是否正确地认为对于不再位于导航堆栈上的视图控制器(即在加载后弹出的视图控制器),任何声明为弱引用的IBOutlets都将被释放?
感谢您的任何见解!

2
一般而言,如果插座已经有静态的 superview(即保持视图存活直到它们成为视图层次结构的一部分,且不会引起强引用循环),则应该将其设置为 weak。同时,如果任何视图被添加到/从任何视图中,则最好使用 strong 引用来确保视图保持存活,直到您最终想要释放它。 - holex
2个回答

2

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

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


这是我感兴趣的内容 - 因此将它们设置为“weak” 可以允许在拥有视图不存在时删除子视图吗? - GuybrushThreepwood
是的,因为代码中唯一(强)引用在它的父视图上。 - IgnazioC

2
您可能已经注意到,当您直接从Interface Builder插入IBOutlet时,可以选择将其作为弱引用或强引用。在苹果开发者库中进行了一些搜索后,我发现应该在何时使用其中之一:

Outlet通常应该是弱的,除了从文件所有者到nib文件(或在iOS中为storyboard场景)中的顶级对象的那些应该是强的。因此,您创建的Outlet通常应该是弱的,因为:

例如,您创建的用于视图控制器的子视图或窗口控制器的窗口的Outlets是对象之间的任意引用,不意味着所有权。

强Outlets通常由框架类指定(例如,UIViewController的view Outlet或NSWindowController的window Outlet)。

更多


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接