引用計數不是垃圾收集。
在參考計數系統一樣可可觸摸,系統當其引用計數變爲零重新分配的對象。
現在考慮編寫一個使用UITableView
的應用程序。您必須提供一個對象來充當表視圖的數據源。您可能會使用您的UIViewController
子類作爲數據源。
您的視圖控制器可能具有對錶視圖的引用。這意味着表視圖的引用計數爲至少1
你的表視圖需要它的數據源的引用。這意味着視圖控制器具有至少爲1
參考計數假設視圖控制器由除了表視圖任何不再被引用,並且該表視圖是由除視圖控制器任何不再參考。你的程序不可能再次使用這些對象,因爲它沒有可以引用的引用路徑,這將導致任何對象。我們可以說對象是「無法訪問」的。即使在那時,也不會銷燬任何物品,因爲每個物品的參考計數都爲1.
在Cocoa Touch中,此場景稱爲保留週期。保留週期不好(除非在發生某些事件時它會自動斷開,如定時器觸發或觸摸結束),因爲它可以防止系統銷燬永遠不會再使用的對象。
這實際上是引用計數和垃圾收集之間的區別:GC收集你的程序將不再能訪問所有對象。引用計數系統收集引用計數爲零的所有對象。
你可以嘗試編寫程序的通知時,視圖控制器和表視圖不再需要。發生這種情況時,您可以明確地中斷保留週期(例如,通過將表視圖的數據源設置爲零)。但總的來說,很難知道什麼時候沒有任何對象可到達。 (這就是爲什麼垃圾收集器非常好:他們爲你做了很多努力。)
在Cocoa Touch中,爲了防止表視圖示例中的保留循環,表視圖引用其數據源「弱」。它保留對數據源的引用,但不會增加或減少數據源的引用計數。因此,當視圖控制器和數據源都變得無法訪問時,表視圖的引用計數仍然爲1(因爲視圖控制器有強引用),但視圖控制器的引用計數爲0.因此,系統將視圖控制器解除分配。在取消分配期間,視圖控制器放棄對錶視圖的引用,這會使表視圖的引用計數爲零,因此係統也可以取消分配它。
事實上,表視圖不使用ARC弱引用(據我所知)。它使用ARC稱之爲__unsafe_unretained
的引用,因爲它是在ARC之前很久才寫入的。但是你應該在代碼中使用ARC弱引用,因爲它們更安全,更實用。
Java有弱引用,你知道。 :) –
僅供參考 - ARC與垃圾收集不同。 ARC就是編譯器自動爲你添加對'retain'和'release'的調用。它與垃圾收集完全不同。 – rmaddy
也許最常見的例子是當對象A具有對象B作爲其代表時。對象A需要使用對象B,但它不擁有它,因此它會很弱。 – Gruntcakes