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