iOS-weak修飾的對象被釋放時,weak指針自動被置為nil的實現原理


我們都知道weak指針不會增加引用計數,並在引用對象被回收的時候自動被置為nil。通常用於解決循環引用問題。那么,自動被置為nil內部又是如何實現的呢?

一、weak的實現原理

概括

Runtime維護了一個weak表,用於存儲指向某個對象的所有weak指針。weak表其實是一個哈希表,Key是所指對象的地址,Value是weak指針的地址(這個地址的值是所指對象的地址)數組。

具體步驟

1、初始化時:runtime會調用objc_initWeak函數,初始化一個新的weak指針指向對象的地址。

2、添加引用時:objc_initWeak函數會調用 objc_storeWeak() 函數,objc_storeWeak() 的作用是更新指針指向,創建對應的弱引用表。

3、釋放時,調用clearDeallocating函數。clearDeallocating函數首先根據對象地址獲取所有weak指針地址的數組,然后遍歷這個數組把其中的數據設為nil,最后把這個entry從weak表中刪除,最后清理對象的記錄。

當weak引用指向的對象被釋放時,如何去處理weak指針?

1、調用objc_release

2、因為對象的引用計數為0,所以執行dealloc

3、在dealloc中,調用了_objc_rootDealloc函數

4、在_objc_rootDealloc中,調用了object_dispose函數

5、調用objc_destructInstance

6、最后調用objc_clear_deallocating

簡單來說:

a. 從weak表中獲取被釋放對象的地址為鍵值的記錄

b. 將包含在記錄中的所有附有 weak修飾符變量的地址,賦值為 nil

c. 將weak表中該記錄刪除

d. 從引用計數表中刪除廢棄對象的地址為鍵值的記錄

參考鏈接: https://blog.csdn.net/xiaohuoziooo/article/details/88029300


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM