開頭
本文是看了 iOS 底層解析weak的實現(xiàn)原理(包含weak對象的初始化霎俩,引用上陕,釋放的分析) 一文后桂对,為了加深自己的理解,從自己的角度來講如何實現(xiàn)類似的功能倦卖。
實現(xiàn) weak
weak 的作用
weak
關(guān)鍵字的作用弱引用洒擦,所引用對象的計數(shù)器不會加一,并在引用對象被釋放的時候自動被設置為 nil
怕膛。
如何實現(xiàn) weak
現(xiàn)在我們將
weak
的思路整理一下:整個系統(tǒng)中存在很多個對象熟嫩,這些對象都可能會被弱引用,那么我們需要一個容器來容納這些被弱引用的對象褐捻,比如數(shù)組掸茅,在此將這個容器的數(shù)據(jù)結(jié)構(gòu)標識為
objectContainerDataStructure
;一個對象可能會被多次弱引用柠逞,當這個對象被銷毀時昧狮,我們需要找到這個對象的所有弱引用,所以我們需要將這些弱引用的地址(即指針)放在一個容器里板壮,比如數(shù)組逗鸣,在此將這些弱引用的地址的數(shù)據(jù)結(jié)構(gòu)標識為
pointerContainerDataStructure
;當對象不再被強引用時需要銷毀的時候个束,我們需要通過這個對象在
objectContainerDataStructure
找到其對應的pointerContainerDataStructure
慕购,進而找到這個對象的所有弱引用聊疲,將其置為nil
茬底,通過上面的步驟,我們大概可以得出這么一個數(shù)據(jù)結(jié)構(gòu):
pointerContainerDataStructure
僅僅只是容納一個對象的所有弱引用的地址获洲,所以用數(shù)組即可阱表;objectContainerDataStructure
是一個key-value
數(shù)據(jù)結(jié)構(gòu),將對象作為key
,對象的內(nèi)存地址是最好的選擇最爬;在
iOS
中常用的key-value
數(shù)據(jù)結(jié)構(gòu)就是字典Dictionary
涉馁,在這里我們的key
是一個數(shù)值對象,value
則是一個數(shù)值數(shù)組對象爱致,可以用哈希表實現(xiàn)烤送;總結(jié)
為了實現(xiàn) weak
,我們需要這樣的一張弱引用表:
表的數(shù)據(jù)結(jié)構(gòu)是哈希表糠悯;
表的
key
是對象的內(nèi)存地址帮坚;value
是指向該對象的所有弱引用的指針;
結(jié)尾
上面是如何自己實現(xiàn) weak
的一個大概思路互艾,Apple
的實現(xiàn)可以看 iOS 底層解析weak的實現(xiàn)原理(包含weak對象的初始化试和,引用,釋放的分析) 一文纫普。