iOS-實(shí)現(xiàn)weak后,為什么對(duì)象釋放后會(huì)自動(dòng)為nil

1. 實(shí)現(xiàn)weak后,為什么對(duì)象釋放后會(huì)自動(dòng)為nil
runtime 對(duì)注冊的類, 會(huì)進(jìn)行布局,對(duì)于 weak 對(duì)象會(huì)放入一個(gè) hash 表中。 用 weak 指向的對(duì)象內(nèi)存地址作為 key,當(dāng)此對(duì)象的引用計(jì)數(shù)為 0 的時(shí)候會(huì) dealloc,假如 weak 指向的對(duì)象內(nèi)存地址是 a ,那么就會(huì)以 a 為鍵, 在這個(gè) weak 表中搜索,找到所有以 a 為鍵的 weak 對(duì)象,從而設(shè)置為 nil 。

2.當(dāng)weak引用指向的對(duì)象被釋放時(shí),又是如何去處理weak指針的呢?

1、調(diào)用objc_release

2、因?yàn)閷?duì)象的引用計(jì)數(shù)為0,所以執(zhí)行dealloc

3、在dealloc中,調(diào)用了_objc_rootDealloc函數(shù)

4、在_objc_rootDealloc中,調(diào)用了object_dispose函數(shù)

5、調(diào)用objc_destructInstance

6、最后調(diào)用objc_clear_deallocating,詳細(xì)過程如下:

a. 從weak表中獲取廢棄對(duì)象的地址為鍵值的記錄

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

c. 將weak表中該記錄刪除

d. 從引用計(jì)數(shù)表中刪除廢棄對(duì)象的地址為鍵值的記錄

weak實(shí)現(xiàn)原理:

Runtime維護(hù)了一個(gè)weak表,用于存儲(chǔ)指向某個(gè)對(duì)象的所有weak指針。
weak表其實(shí)是一個(gè)hash(哈希)表,Key是weak所指對(duì)象的地址,Value是weak指針的地址(這個(gè)地址的值是所指對(duì)象指針的地址)數(shù)組。

1、初始化時(shí):runtime會(huì)調(diào)用objc_initWeak函數(shù),初始化一個(gè)新的weak指針指向?qū)ο蟮牡刂贰?/p>

2、添加引用時(shí):objc_initWeak函數(shù)會(huì)調(diào)用 objc_storeWeak() 函數(shù), objc_storeWeak() 的作用是更新指針指向,創(chuàng)建對(duì)應(yīng)的弱引用表。

3、釋放時(shí),調(diào)用clearDeallocating函數(shù)。clearDeallocating函數(shù)首先根據(jù)對(duì)象地址獲取所有weak指針地址的數(shù)組,然后遍歷這個(gè)數(shù)組把其中的數(shù)據(jù)設(shè)為nil,最后把這個(gè)entry從weak表中刪除,最后清理對(duì)象的記錄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容