2012-01-14 30 views
12

我正在學ARC。現在關於調零弱指針。我很瞭解所有功能。 弱引用的語義和GC系統的弱引用一樣,但是你知道,Objective-C沒有使用GC(除了特殊情況),所以我不明白它是如何工作的。ARC的調零弱指針行爲如何實現?

我有點複雜的人,所以我需要知道底層的實現主體接受使用的功能。但是,問題在於它很難找到描述歸零弱指針的原理:(

IMO,使這項工作的唯一方法是在運行時跟蹤並保持所有指向自身的指針,並將它們全部設置爲nil當其引用計數變爲0。但是,這看起來太沉重的和愚蠢的。我相信,在實際ARC實現中使用了很多更好的解決方案。

你能幫我找到文檔?還是直接說明會更偉大!

回答

17

這裏說明:

http://mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html

劇透:

它的工作原理幾乎你是怎麼想的。每個類都維護一組指向它的弱指針地址,當它調用dealloc時,它將它們都設置爲零。

這似乎是愚蠢的,但它的速度快,因爲沒有「跟蹤」參與,ARC只是插入代碼的指針每個對象被分配到一個新的弱引用時添加到該組。

它實際上比參與垃圾收集在掛羊頭賣狗肉,這主要涉及通過堆在後臺線程涉水尋找指針和保持他們指着什麼股票更有效。

+2

實際上,在ARC下,編譯器發出代碼來調用函數,比如'objc_storeWeak'和'objc_loadWeakRetain'。這些函數是一個記錄的API:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime – 2012-01-14 04:44:09

+0

是的,這些函數是如何添加和刪除存儲在對象中的集合中的弱指針,如我所述當我說「ARC只是添加代碼來添加一個指針,該對象被分配給一個新的弱引用時,該指針」 – 2012-01-15 09:47:32

+0

你知道弱指針是否歸零時,對象的引用計數下降爲0,還是在去分配時?我現在用一個「分配」指針遇到了一個問題,在那裏被引用的對象被重用,但仍然調用它的dealloc,因爲它的引用計數降到了0之間。我想知道零點弱指針是否能解決這個問題。 – fishinear 2013-03-07 08:35:39