2014-02-17 66 views
0

由於蘋果在2011年推出了自動引用計數,所以從未真正想過,但如果您看到ARC algorithm並且根據apple documentation所有對象在一段時間後都會被破壞。目標c用於內存管理的ARC AC算法,是垃圾收集?

enter image description here

如果我看到從WWDC 2011發佈視頻中可以看到,這是不是一個垃圾收集器。 所以問題是,如果它確實使用垃圾收集器算法並且所有對象最終都會被破壞,爲什麼不是垃圾收集器?

對不起,如果這已經問過,但我真的搞不清這個問題,我需要幫助,以充分理解它

+1

我不完全明白你的問題,或者確切地說你的困惑......垃圾收集器是一個通常定期運行並釋放不再被程序引用的對象的軟件。 ARC僅在編譯時編譯「保留」/「釋放」語句。所以沒有運行的軟件可以清理ARC下的內存,這就是爲什麼它不是垃圾收集器。 –

+0

這就是我的想法,但一位老師今天真的搞砸了我的想法。 – jycr753

回答

4

這是一個有點哲學問題的,但本質上,它是一個編譯時垃圾回收器,作爲一個反對運行時間垃圾回收器。

而不是與程序一起運行的垃圾收集子系統,管理保留計數並確保所有必要的發佈和保留都放在正確的位置。

這樣做的實際結果是,因爲它是由編譯器完成,它不太容易出錯比手動保留/釋放,因爲它在編譯期時間完成的,它比垃圾收集得更快。

This question應該進一步闡明這個問題。

3

ARC與垃圾收集算法完全無關。自動引用計數(ARC)使用引用計數作爲其確定對象可達性的基本機制。相比之下,垃圾收集算法維護着一個「根」對象列表(例如局部變量,靜態變量,線程對象),並使用這些根來遍歷對象圖來檢查對象的可達性。這個過程是非確定性的,因爲你永遠不知道什麼時候GC算法要運行,何時不再引用的對象將被垃圾收集。你所知道的是他們最終會被垃圾收集,但「最終」可能意味着很長時間。由於GC使用圖遍歷進行可達性分析,因此它不關心圖中的週期:如果某個對象可以從根集中的一組對象而不是到達,它仍然被認爲是垃圾並且會被收集。因此,您不必擔心保留週期 - 這是一個非常實際的問題,在使用引用計數系統時需要時刻牢記。

引用計數比垃圾收集要簡單得多:每個對象的引用計數如圖所示,retain遞增,release遞減。一旦計數達到零,對象就會被銷燬。這就是它! ARC所做的就是自動將呼叫插入retainrelease。事實上,如果我們正在談論新的ARC或者Cocoa的ARC之前的內存管理,單從這個圖表是不可能的。在參考計數系統下,您可以確切知道什麼時候您的物體將被釋放 - 只要其參考計數達到零就會發生。自動釋放使得這種方式對你來說可能不那麼明顯,因爲最後一個引用可能會在代碼之外被釋放,但這不會使進程不確定。此外,該語言讓你可以完全控制autoreleasing,讓你創建自己的autorelease池。

+0

看到那個老師在@ user3319052提到我的想法...... – jycr753

+1

@ jycr753我認爲引用計數和垃圾收集系統是不同的,可以分開處理。它們都實現了資源管理自動化的共同目標,但這也是它們相似之處的結局。調用其他各種方法對需要使用兩者編程的程序員(例如來自Android背景的iOS開發人員或反之)都不利。認爲兩者基本相同會導致極小的錯誤,最終導致成本非常高,因爲它們很難找到。 – dasblinkenlight

1

我想補充一點,GC通常會檢查整個對象圖以在循環引用中查找不可訪問的對象。在ARC中 - 它仍然是RC - 只有一個被釋放對象的關係纔會被審查。如果您有循環引用,則永遠不會執行,參與的對象將永遠不會被釋放。

1

顯然我不能給出評論的答案(新帳戶)。然而,@daskblinkenlight描述的內容正是Peter Sestoft編程語言概念定義爲引用計數的垃圾回收(頁179)。我真的沒有看到區別。

而且,我寫了問他的電子郵件,以彼得·塞斯托夫特(在ITU哥本哈根教授)如果ARC是一個垃圾收集和他給了以下的答案(丹麥翻譯): 「在我看來(和例如保羅Wilsons調查「單處理器垃圾收集技術」)ARC絕對是一個垃圾收集器。「

+1

我無法訪問該書,因此我無法詳細回答。問題是沒有定義術語「垃圾收集」。在Objective-C語境中,請記住已有一個「傳統」GC,引用的簿記在全局和異步完成,而在ARC中,簿記在本地和同步(=當一個對象被解除分配時)完成。如果你想在一般情況下使用GC這個詞,你也可以稱之爲GC。這是一個定義問題。無論如何,從事GC工作的人都試圖擴展定義。也許他們想要包含更多現代技術...... –