runtime維護了一個weak表,用於存儲指向某個對象的所有weak指針。weak表其實是一個hash(哈希)表,key是所指對象的地址,Value是weak指針的地址(這個地址的值是所指對象指針的地址)數組。
步驟:
- 初始化時:runtime會調用objc_initWeak函數,初始化一個新的weak指針指向對象的地址。
- 添加引用時:objc_initWeak函數會調用 storeWeak() 函數, storeWeak() 的作用是更新指針指向,創建對應的弱引用表。
- 釋放時,調用clearDeallocating函數。clearDeallocating函數首先根據對象地址獲取所有weak指針地址的數組,然後遍歷這個數組把其中的數據設爲nil,最後把這個entry從weak表中刪除,最後清理對象的記錄。
具體參考:這裏