以前我只是知道weak是弱引用甩恼,所引用對象的計數(shù)器不會加一,并在引用對象被釋放的時候自動被設(shè)置為nil金闽。通常用于解決循環(huán)引用問題。但是看了網(wǎng)上大神的文章剿骨,整理一下代芜,作為學習筆記。
Weak本質(zhì)
Weak本質(zhì)其實是一個哈希表懦砂,Key對應的是對象的地址蜒犯,Value對應的是weak指針的地址數(shù)組组橄。Runtime維護了一個weak表荞膘,用于存儲指向某個對象的所有weak指針。
Weak初始化
runtime會調(diào)用objc_initWeak函數(shù)玉工,初始化一個新的weak指針指向?qū)ο蟮牡刂贰?/p>
添加Weak
objc_initWeak函數(shù)會調(diào)用 objc_storeWeak() 函數(shù)羽资, objc_storeWeak() 的作用是更新指針指向,創(chuàng)建對應的弱引用表遵班。
釋放Weak
釋放時屠升,調(diào)用clearDeallocating函數(shù)。clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組狭郑,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設(shè)為nil腹暖,最后把這個entry從weak表中刪除,最后清理對象的記錄翰萨。