weak屬性的特點:
weak 表明該屬性定義了一種“非擁有關系” (nonowning relationship)反璃。
為weak屬性設置新值時假夺,設置方法既不保留新值,也不釋放舊值已卷。
同assign類似,然而在屬性所指的對象釋放時候裁眯,屬性值也會清空(nil out)讳癌。
runtime是如何實現(xiàn) weak 變量的自動置nil?
weak 對象會放入一個 hash 表中逢艘。
用 weak 指向的對象內存地址作為 key,當此對象的引用計數(shù)為0的時候會 dealloc埋虹。
假如 weak 指向的對象內存地址是addr,那么就會以addr為鍵胰柑, 在這個 weak 表中搜索爬泥,找到所有以addr為鍵的 weak 對象,從而設置為 nil踩官。
具體機制:
objc_storeWeak(&weakPo, Model)函數(shù):
objc_storeWeak函數(shù)把賦值對象(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發(fā)送消息不會崩潰:在Objective-C中向nil發(fā)送消息是安全的。