2012-02-16 59 views
4

您好!目標-c中使用委託的ARC循環引用

我試着在我的應用程序中使用委託。我的項目使用ARC

enter image description here

例如,我有協議X​​和其採用的兩項對象。 在對象我創建的實例爲對象並設置代表自(A.delegate =自我) 在運行時I調用一個方法回調(在這一點上我的委託對象是)。之後,他們都執行-showResult方法。

在什麼時候形成了循環參考?我知道這是指定者的問題,但我不明白它發生了什麼時間,以及如何跟蹤它。

謝謝!

+1

一般而言,您應該使委託屬性「weak」而不是「strong」來幫助避免保留週期。 – UIAdam 2012-02-16 15:30:27

+0

感謝您的回覆!是的,我知道它,但是在哪一刻我能看到形成了一個循環參考?我想說我想知道它是如何跟蹤的?我知道我的認識不正確。 – 2012-02-16 15:34:50

回答

13

如果兩個對象都保持對方的強引用(即它們保留對方),那麼您的手上可能會有所謂的「保留週期」。這兩個對象都不會被釋放,因爲另一個對象會強烈地引用它(保留它),所以它永遠不會放棄它的引用(釋放)另一個對象。

這種情況對於代表來說很常見,其中一個對象(稱爲A)創建另一個對象(B)並將自己設置爲B的代表。如果A對B有強烈的引用,那麼B不會被解除分配,而B對A也有強烈的引用,那麼就有一個參考週期。爲了避免這種情況,對象通常不會保留或保留對其代表的強烈引用。讓B對弱點的引用不是強而且問題消失。

+0

好的!感謝您的回覆!這是一個很好的解釋! – 2012-02-16 15:45:57

1

看起來您在B中對A保持強烈的引用。要麼使其成爲弱引用,要麼 - 這是常見的做法 - 使代表成爲弱引用。在後一種情況下,您應確保在B解除分配之前將A的delegate設置爲nil

+0

感謝您的回覆!是的我的認識不正確。我只是想在強弱之間進行追蹤。我想知道 - 有哪些不同。我知道弱點。 – 2012-02-16 15:39:27