2015-03-03 119 views
1

我正在重讀"Transitioning to ARC Release Notes"爲什麼在ARC支持平臺中不能支持弱引用?

在開始的時候,它說

ARC是在Xcode 4.2支持OS X v10.6中和v10.7(64位 應用)和爲iOS 4和iOS 5.弱引用是不支持OS X v10.6和iOS 4中的 。

這是爲什麼?實施薄弱的參考需要深入的平臺/操作系統支持嗎?

我想,弱引用不是那麼特別(考慮到C++原始指針的用法)。

難道不是技術原因嗎? (弱參考支持是因爲它失敗了一些測試用例而失敗,並且他們沒有足夠的時間?)

回答

5

弱引用是自我調零。在指向的對象開始其dealloc之前,它們被設置爲nil,並且任何試圖將處於釋放中的對象分配給weak引用引發異常。因此,運行時需要能夠存儲一個附加映射:從對象到對該對象的任何弱引用。 iOS 4沒有實現該表。

它們和C++的weak_ptr之間的主要實現區別在於沒有轉換步驟,因爲轉換爲shared_ptr。推動nil ing,而不是拉動。引用只能在機器級別作爲常規指針加載。

Objective-C運行時必須擴展來處理這個問題的部分原因是Objective-C對象通常不能存在於堆棧中。因此,自動跟蹤它們需要編譯器和運行時間之間的更大的陰謀。與STL不同,您不會看到ARC首先作爲第三方解決方案出現。

實際上它只是一些額外的C調用沒有實現。編譯器支持到位,如果你真的想要並支持iOS 4及更低版本的弱引用,你可以自己實現它們。邁克阿什做了。蘋果的決定很可能與其對開發技術落後支持的一般態度有關:它寧願每個人都使用最新的技術。

+0

我不知道。太奇妙了!! – 9dan 2015-03-03 04:30:17

1

弱屬性是'歸零弱引用',這意味着當對象被解除分配時,對該對象的所有弱引用自動地爲nil。在iOS5之前,對於實現這項工作所需的對Objective C運行時所做的更改尚未引入。 ARC被允許在iOS4中使用unsafe_unretained來代替弱點,如果它們指向的對象被釋放,可能會變成懸掛指針。