iOS 中 weak 的實現原理

開頭

本文是看了 iOS 底層解析weak的實現原理(包含weak對象的初始化,引用,釋放的分析) 一文后,為了加深自己的理解,從自己的角度來講如何實現類似的功能。

實現 weak

weak 的作用

weak 關鍵字的作用弱引用,所引用對象的計數器不會加一,并在引用對象被釋放的時候自動被設置為 nil

如何實現 weak
  1. 現在我們將 weak 的思路整理一下:

  2. 整個系統中存在很多個對象,這些對象都可能會被弱引用,那么我們需要一個容器來容納這些被弱引用的對象,比如數組,在此將這個容器的數據結構標識為 objectContainerDataStructure

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

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

  5. 通過上面的步驟,我們大概可以得出這么一個數據結構:

  6. pointerContainerDataStructure 僅僅只是容納一個對象的所有弱引用的地址,所以用數組即可;

  7. objectContainerDataStructure 是一個 key-value 數據結構,將對象作為 key,對象的內存地址是最好的選擇;

  8. iOS 中常用的 key-value 數據結構就是字典 Dictionary ,在這里我們的 key 是一個數值對象,value 則是一個數值數組對象,可以用哈希表實現;

  9. 總結

為了實現 weak,我們需要這樣的一張弱引用表:

  1. 表的數據結構是哈希表;

  2. 表的 key 是對象的內存地址;

  3. value 是指向該對象的所有弱引用的指針;

結尾

上面是如何自己實現 weak 的一個大概思路,Apple 的實現可以看 iOS 底層解析weak的實現原理(包含weak對象的初始化,引用,釋放的分析) 一文。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容