2013-07-02 73 views
-1

我在UINavigationController中有兩個UIViewControllers。
viewControllerA是viewControllerB的委託。
顯然,viewControllerA沒有對viewControllerB的引用。
viewControllerB具有對viewControllerA的引用,因爲vcA是vcB的委託。
爲什麼委託引用很弱?

我被告知代表參考應該很弱。
就我而言,我不認爲這是真的。
如果UINavigationController將決定放棄vcA,則vcB的委託將爲零。
但是,如果對vcA的引用很強烈,vcB仍然會引用它。

那麼爲什麼代表們很弱?
是的,我知道它之前已被問過。是的,我花了很多時間試圖理解這一點。 但我似乎並不瞭解這一點。

謝謝。

+1

因爲如果一個對象X設置本身作爲對象Y的代表,那麼很可能是X具有很強的裁判Y和如果Y有一個X(其代表)也一樣,這將導致保留週期。 – 2013-07-02 18:31:31

+0

我認爲vcA是'rootViewController'並且vcB被推到最上面? –

+0

@意義 - 事情正是如此。 –

回答

0

在我看來,代表應該弱(或分配在非ARC代碼)以避免循環。

一個典型的情況下,我們在許多樣品中看到的,是:

_myViewController = [[MyViewController alloc] init]; 
_myViewController.delegate = self; 

這將產生一個循環,如果代表是強的,因爲_myViewController由原始對象,而這又是通過_myViewController參考引用。

+0

你可以從你的答案中刪除'在我看來',這是代表應該是'弱/分配'的唯一原因。 ;)) – danypata

+0

對委託的強引用也有很好的理由,參見'NSURLConnection'。 –

+0

@MartinR:雖然它們都被稱爲「委託」,但在我看來,NSURLConnection在其短期生命週期內完成實際工作所需的臨時保留對象與視圖控制器的委託有點不同。 – Chuck

0

我認爲當B類提供一個委託給A類時.A類將爲這個委託分配一個強大的委託,現在如果B類也使這個委託強壯,這將導致內存泄漏。由於這兩個階級都強烈地提到這個代表,所以只有當這個代表變得虛弱而另外一代人失去記憶時,它才能被釋放。

Good Link

相關問題