weak 的實現(xiàn)原理

weak 關(guān)鍵字的作用弱引用,所引用對象的計數(shù)器不會加一,并在引用對象被釋放的時候自動被設(shè)置為nil.

整個系統(tǒng)中存在很多個對象,這些對象都可能會被弱引用,那么我們需要一個容器來容納這些被弱引用的對象,如數(shù)組,在此將這個容器的數(shù)據(jù)結(jié)構(gòu)標識為objectContainerDataStructure;

一個對象可能會被多次弱引用,當這個對象被銷毀時,我們需要找到這個對象的所有弱引用,所以我們需要將這些弱引用的地址(即指針)放在一個容器里,如數(shù)組,在此將這些弱引用的地址的數(shù)據(jù)結(jié)構(gòu)標識為pointerContainerDataStructure;

當對象不再被強引用時需銷毀時,我們需要通過這個對象在 objectContainerDataStructure 找到其對應(yīng)的pointerContainerDataStructure,進而找到這個對象的所有弱引用,將其置為nil,

通過上面的步驟,我們大概可以得出這么一個數(shù)據(jù)結(jié)構(gòu):

1、pointerContainerDataStructure 僅僅只是容納一個對象的所有弱引用的地址,所以用數(shù)組即可;
2、objectContainerDataStructure 是一個 key-value 數(shù)據(jù)結(jié)構(gòu),將對象作為 key,對象的內(nèi)存地址是最好的選擇;
3、在 iOS 中常用的 key-value 數(shù)據(jù)結(jié)構(gòu)就是字典 Dictionary ,在這里我們的key 是一個數(shù)值對象,value 則是一個數(shù)值數(shù)組對象,可以用哈希表實現(xiàn)。

總結(jié):
weak表是一個hash(哈希)表,Key是所指對象的地址,Value是weak指針的地址數(shù)組。

1、初始化時:runtime會調(diào)用objc_initWeak函數(shù),初始化一個新的weak指針指向?qū)ο蟮牡刂贰?br> 2、添加引用時:objc_initWeak函數(shù)會調(diào)用 objc_storeWeak() 函數(shù),objc_storeWeak() 的作用是更新指針指向,創(chuàng)建對應(yīng)的弱引用表。
3、釋放時,調(diào)用clearDeallocating函數(shù)。clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設(shè)為nil,最后把這個entry從weak表中刪除,最后清理對象的記錄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容