iOS開發 Runtime是如何實現weak屬性的?

GabrielPanda發表於2018-01-25

weak屬性的特點: weak 表明該屬性定義了一種“非擁有關係” (nonowning relationship)。 為weak屬性設定新值時,設定方法既不保留新值,也不釋放舊值。 同assign類似,然而在屬性所指的物件釋放時候,屬性值也會清空(nil out)。

runtime是如何實現 weak 變數的自動置nil?

weak 物件會放入一個 hash 表中。 用 weak 指向的__物件記憶體地址__作為 key,當此物件的引用計數為0的時候會 dealloc。 假如 weak 指向的物件記憶體地址是addr,那麼就會以addr為鍵, 在這個 weak 表中搜尋,找到所有以addr為鍵的 weak 物件,從而設定為 nil。

具體機制:

objc_storeWeak(&weakPo, Model)函式:

objc_storeWeak函式把賦值物件(Model)的記憶體地址作為鍵值key,將weak修飾的屬性變數(weakPo)的記憶體地址(& weakPo)作為value,註冊到 weak 表中。

如果Model為0(nil),那麼把變數(weakPo)的記憶體地址(& weakPo)從weak表中刪除,

可以把objc_storeWeak(&weakPo, Model)理解為:objc_storeWeak(value, key),並且當key變nil,將value置nil。

在Model非nil時,weakPo和Model指向同一個記憶體地址,在Model變nil時,weakPo變nil。此時向weakPo傳送訊息不會崩潰:在Objective-C中向nil傳送訊息是安全的。

具體過程objc/objc-weak.h程式碼連結

相關文章