簡體   English   中英

為什么__weak屬性需要運行時支持

[英]Why do __weak properties require runtime support

在boost C ++中,弱指針被實現為共享(引用計數)指針的觀察者。

它們如何在Objective-C中實現,為什么這需要運行時支持? (即,除了具有編譯器支持之外,還需要iOS 5或更高版本才能使用弱引用)

當釋放它們所指向的對象時,Objective-C弱引用將設置為nil 這非常方便(它使您可以解決引用循環並避免將消息發送到已釋放的對象),但是它確實要求運行時跟蹤對對象的所有弱引用,並且,當最終釋放對象時,運行時必須淘汰那些引用。

這兩件事只能由Objective-C運行時透明地完成。 Objective-C不具備C ++自己在自己的代碼中實現這種魔術的靈活性。

std :: weak_ptr實際上包含一個指向共享數據結構的指針,該數據結構保存簿記數據和引用的對象。 當引用的對象被銷毀時,共享數據將保留在周圍,以便weak_ptrs可以看到表示該對象已消失的簿記數據,並且在釋放引用的對象時不必修改weak_ptrs本身。

在Objective-C中,弱引用不指向某些保存簿記數據的中間對象。 它們是普通指針,指向實際引用的對象,如果引用的對象不存在,則指向nil。 當代碼的其他部分釋放指向對象的最后一個非弱指針時,必須更新每個__weak指針。 這需要運行時支持。

換句話說,Obj-C弱指針是普通的指針,除了它們上有編譯器魔術(使用運行時支持)外,而shared_ptrs和weak_ptrs只是實現自己的運行時支持的包裝器(在智能指針的構造函數中,賦值運算符,析構函數等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM