Runtime維護(hù)了一個(gè)weak表胞谈,用于存儲(chǔ)指向某個(gè)對(duì)象的所有weak指針尘盼。weak表其實(shí)是一個(gè)hash(哈希)表,Key是所指對(duì)象的地址烦绳,Value是weak指針的地址(這個(gè)地址的值是所指對(duì)象的地址)數(shù)組卿捎。
weak 的實(shí)現(xiàn)原理可以概括一下三步:
1、初始化時(shí):runtime會(huì)調(diào)用objc_initWeak函數(shù)径密,初始化一個(gè)新的weak指針指向?qū)ο蟮牡刂贰?/p>
2午阵、添加引用時(shí):objc_initWeak函數(shù)會(huì)調(diào)用 objc_storeWeak() 函數(shù), objc_storeWeak() 的作用是更新指針指向,創(chuàng)建對(duì)應(yīng)的弱引用表底桂。
3植袍、釋放時(shí),調(diào)用clearDeallocating函數(shù)籽懦。clearDeallocating函數(shù)首先根據(jù)對(duì)象地址獲取所有weak指針地址的數(shù)組于个,然后遍歷這個(gè)數(shù)組把其中的數(shù)據(jù)設(shè)為nil,最后把這個(gè)entry從weak表中刪除暮顺,最后清理對(duì)象的記錄厅篓。