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傳送訊息是安全的。