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表中刪除,最后清理對象的記錄。