2011-10-13 95 views
-1

隨着iOS的最新版本Apple爲Objective-C實現了自動引用計數,但我不理解爲作品。自動引用計數是否作爲垃圾收集器工作?

+1

您是否嘗試過[查看文檔](http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html)?或者[其他文檔](http://www.google.com/url?sa=t&source=web&cd=1&ved=0CCQQFjAA&url=http%3A%2F%2Fclang.llvm.org%2Fdocs%2FAutomaticReferenceCounting.html&ei=1iaXTriaLcnPiALP_azDDQ&usg=AFQjCNHBcQAROrz81zpnzFhm8tW7ApG47g )? –

+0

或者只是在這裏做一個搜索:http://stackoverflow.com/questions/6385212/how-does-the-new-automatic-reference-counting-mechanism-work –

+0

謝謝你的幫助,但我只想一個明確的信息,沒有閱讀許多頁面的文檔...否則就沒有理由問stackoverflow的問題... – ADIMO

回答

12

自動引用計數插入retainrelease郵件到你的代碼在編譯時,按照正常慣例。所以就像你自己手動進行內存管理一樣,除了編譯器足夠聰明以便能夠爲你編寫這些內容,並且不太可能犯錯。

因此,它不是垃圾收集,它更像是一個(非常簡單)的靜態分析形式。根據以下Catfish_Man提出的警告,您仍然獲得壓倒性的確定性內存管理,並且運行時成本的整體變化很小。

+3

運行時成本的變化並不準確。編譯器必須比人類更關注對象的生命週期,這通常會導致大約20%的重新計數流失。另一方面,在許多情況下,ARC有一些巧妙的技巧來避免自動釋放,這可以降低內存使用並提高性能。無論是贏得還是失敗,都取決於問題的確切代碼。 –

+0

好點。我淡化了我的回答,並明確提到了你的評論。 – Tommy

+0

@Tommy:你說「100%確定性」,但文檔說「允許ARC以可能改變總體計算曆史的方式重新排序和消除操作」。 http://clang.llvm.org/docs/AutomaticReferenceCounting.html#optimization –

1

自動引用計數實現了Objective-C對象和塊的自動內存管理,使程序員不必明確插入保留和釋放。 它不提供循環收集器;用戶必須明確地管理生命期。

閱讀本規範 - Automatic Reference Counting