2014-02-17 24 views
5

我最近在這裏和其他網站上看到很多關於IBOutlets應該強還是弱的問題。官方的裁決是,他們應該是弱的,除了當他們參考頂級xib對象時。IBOutlets強大還是弱點 - 它實際上是否影響內存管理? (ARC)

這很好。

但是我還沒有清楚地理解,爲什麼設置它們強或弱實際上會在應用程序的內存管理方面產生差異。特別是從iOS6開始,viewDidUnload在接收到內存警告時不會被調用,所以從這個意義上說,IBOutlets的弱或者強選擇沒有任何區別。

我是否認爲視圖控制器不再位於導航棧上(即在它們被加載然後彈出之後),那麼任何聲明爲弱的IBOutlets都會被釋放?

感謝您的任何見解!

+2

,你保持出口'weak'如果他們有一個靜態的'superview'已經(即保持視圖活着,直到他們認爲層次結構的一部分,它不會引起強烈的保留週期),並且如果有任何視圖添加到/從任何'view'中移除,'strong'引用更好地確保視圖保持活動狀態,直到您最終想要釋放視圖。 – holex

回答

1

IBOutlets可以聲明爲弱,因爲它們將在XIB解析期間創建並添加到UIView堆棧中...因此您不需要對該對象的強引用。

當您聲明IBOutlet較弱時,請確保當UIViewcontroller的主UIView消失時,每個子視圖都將被刪除而不會有任何內存泄漏。

+0

這就是我所感興趣的 - 所以將它們設置爲弱可以讓子視圖一旦擁有視圖不再被刪除,就會被刪除? – GuybrushThreepwood

+0

是的,因爲代碼中唯一的(強)引用在他的超級視圖上。 – IgnazioC

2

您可能已經注意到,當您直接從Interface Builder中插入IBOutlet時,可以選擇是將它作爲弱還是強的屬性。在Apple開發人員庫中進行了一些搜索後,我發現您應該使用其中一種或另一種:

出口通常應該很弱,除了那些從文件所有者到nib文件中的頂級對象(或者iOS,一個故事板場景)應該是強大的。因此,您創建的插座通常應該較弱,因爲:

例如,您爲視圖控制器視圖或窗口控制器窗口的子視圖創建的插座是不暗示所有權的對象之間的任意引用。 強大的插座通常由框架類指定(例如,UIViewController的視圖插座或NSWindowController的窗口插座)。

more

一般
相關問題