weak是runtime維護的一個hash表,用于存儲指向某一個對象的所有指針。weak表其實是一個hash表,key是所指對象的指針,value是weak指針的地址(這個地址的值是所指對象指針的地址)數(shù)組。
- 初始化時:
runtime會調用objc_initWeak函數(shù),初始化一個新的weak指針指向對象的地址。 - 添加引用時:
objc_initWeak函數(shù)會調用objc_storeWeak()函數(shù),objc_storeWeak()的作用是更新指針的指向,創(chuàng)建對應的弱引用表。 - 釋放時:調用
clearDeallocating函數(shù)。clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設為nil,最后把這個entry從weak表中刪除,最后清理對象的記錄。
runtime如何實現(xiàn)weak變量的自動置nil?
runtime對注冊的類,會進行布局,對于weak對象會放入一個hash表中,用weak所指向的對象內存地址作為key,當此對象的引用計數(shù)為0的時候會dealloc,假如weak指向的對象內存地址是a,那么就會以a為鍵,在這個weak表中搜索,找到所有以a為鍵的weak對象,從而設置為nil。