
開頭
本文是看了 iOS 底層解析weak的實現原理(包含weak對象的初始化,引用,釋放的分析) 一文后,為了加深自己的理解,從自己的角度來講如何實現類似的功能。
實現 weak
weak 的作用
weak
關鍵字的作用弱引用,所引用對象的計數器不會加一,并在引用對象被釋放的時候自動被設置為 nil
。
如何實現 weak
現在我們將
weak
的思路整理一下:整個系統中存在很多個對象,這些對象都可能會被弱引用,那么我們需要一個容器來容納這些被弱引用的對象,比如數組,在此將這個容器的數據結構標識為
objectContainerDataStructure
;一個對象可能會被多次弱引用,當這個對象被銷毀時,我們需要找到這個對象的所有弱引用,所以我們需要將這些弱引用的地址(即指針)放在一個容器里,比如數組,在此將這些弱引用的地址的數據結構標識為
pointerContainerDataStructure
;當對象不再被強引用時需要銷毀的時候,我們需要通過這個對象在
objectContainerDataStructure
找到其對應的pointerContainerDataStructure
,進而找到這個對象的所有弱引用,將其置為nil
,通過上面的步驟,我們大概可以得出這么一個數據結構:
pointerContainerDataStructure
僅僅只是容納一個對象的所有弱引用的地址,所以用數組即可;objectContainerDataStructure
是一個key-value
數據結構,將對象作為key
,對象的內存地址是最好的選擇;在
iOS
中常用的key-value
數據結構就是字典Dictionary
,在這里我們的key
是一個數值對象,value
則是一個數值數組對象,可以用哈希表實現;總結
為了實現 weak
,我們需要這樣的一張弱引用表:
表的數據結構是哈希表;
表的
key
是對象的內存地址;value
是指向該對象的所有弱引用的指針;
結尾
上面是如何自己實現 weak
的一個大概思路,Apple
的實現可以看 iOS 底層解析weak的實現原理(包含weak對象的初始化,引用,釋放的分析) 一文。