1

我做一點閱讀,我已經找到了很多關於怎麼回事兒,但不是爲什麼爲什麼我會使用弱引用?

從我已閱讀,自動引用計數,內存管理比一個更容易它會在過去。據我瞭解,它類似於Java中的垃圾收集,不同之處在於它在編譯時而不是運行時處理。即編譯器會插入跟蹤對象有多少引用的代碼,然後在計數達到0時將其解除分配。

在我寫的代碼中,至今我已經遇到了很多與對象消失有關的問題,這是因爲ARC因爲我沒有使用強大的參考資源而取消分配它們。我從這些問題中解脫出來是......總是總是使用強烈的參考!

所以我的問題是爲什麼弱引用甚至存在?即我作爲一個開發人員何時會想要參考一個我不能依賴的對象,而不會在我不知情的情況下解除分配?

+2

Java有弱引用,你知道。 :) –

+2

僅供參考 - ARC與垃圾收集不同。 ARC就是編譯器自動爲你添加對'retain'和'release'的調用。它與垃圾收集完全不同。 – rmaddy

+0

也許最常見的例子是當對象A具有對象B作爲其代表時。對象A需要使用對象B,但它不擁有它,因此它會很弱。 – Gruntcakes

回答

2

引用計數不是垃圾收集。

在參考計數系統一樣可可觸摸,系統當其引用計數變爲零重新分配的對象。

現在考慮編寫一個使用UITableView的應用程序。您必須提供一個對象來充當表視圖的數據源。您可能會使用您的UIViewController子類作爲數據源。

您的視圖控制器可能具有對錶視圖的引用。這意味着表視圖的引用計數爲至少1

你的表視圖需要它的數據源的引用。這意味着視圖控制器具有至少爲1

參考計數假設視圖控制器由除了表視圖任何不再被引用,並且該表視圖是由除視圖控制器任何不再參考。你的程序不可能再次使用這些對象,因爲它沒有可以引用的引用路徑,這將導致任何對象。我們可以說對象是「無法訪問」的。即使在那時,也不會銷燬任何物品,因爲每個物品的參考計數都爲1.

在Cocoa Touch中,此場景稱爲保留週期。保留週期不好(除非在發生某些事件時它會自動斷開,如定時器觸發或觸摸結束),因爲它可以防止系統銷燬永遠不會再使用的對象。

這實際上是引用計數和垃圾收集之間的區別:GC收集你的程序將不再能訪問所有對象。引用計數系統收集引用計數爲零的所有對象。

你可以嘗試編寫程序的通知時,視圖控制器和表視圖不再需要。發生這種情況時,您可以明確地中斷保留週期(例如,通過將表視圖的數據源設置爲零)。但總的來說,很難知道什麼時候沒有任何對象可到達。 (這就是爲什麼垃圾收集器非常好:他們爲你做了很多努力。)

在Cocoa Touch中,爲了防止表視圖示例中的保留循環,表視圖引用其數據源「弱」。它保留對數據源的引用,但不會增加或減少數據源的引用計數。因此,當視圖控制器和數據源都變得無法訪問時,表視圖的引用計數仍然爲1(因爲視圖控制器有強引用),但視圖控制器的引用計數爲0.因此,系統將視圖控制器解除分配。在取消分配期間,視圖控制器放棄對錶視圖的引用,這會使表視圖的引用計數爲零,因此係統也可以取消分配它。

事實上,表視圖不使用ARC弱引用(據我所知)。它使用ARC稱之爲__unsafe_unretained的引用,因爲它是在ARC之前很久才寫入的。但是你應該在代碼中使用ARC弱引用,因爲它們更安全,更實用。

+0

謝謝,這個解釋真的很有幫助! – Chris

+0

'__unsafe_unretained'是如此命名的,因爲在ARC下,一旦引用的對象被釋放,普通的'weak'引用會被自動賦值爲'nil'。既然你可以在Objective-C中提供'nil',這可以幫助防止崩潰(通常)。 '__unsafe_unretained'引用對保留計數沒有貢獻,但是如果你在釋放一個消息後發送消息,你會得到一個'EXC_BAD_ACCESS'錯誤(可能)。 –

相關問題