iOS中弱引用管理相關(guān)問題

關(guān)于弱引用在工作和面試中都會(huì)經(jīng)常遇到,那么這里我就兩個(gè)問題說一下弱引用管理。

weak變量是怎樣添加到弱引用表中的?

當(dāng)使用如下代碼

id __weak obj1 = obj;

經(jīng)過編譯之后會(huì)變成:

id obj1;
objc_initWeak(&obj1,obj);

一個(gè)被聲明為__weak的對(duì)象指針,經(jīng)過編譯器的編譯之后,會(huì)調(diào)用objc_initWeak()方法,經(jīng)過一系列的函數(shù)調(diào)用棧,最終會(huì)在weak_register_no_lock()函數(shù)中進(jìn)行弱引用變量的添加,具體添加的位置是通過Hash算法來進(jìn)行位置查找的,如果查找過程中已經(jīng)有了當(dāng)前對(duì)象對(duì)應(yīng)的弱引用數(shù)組,就把這個(gè)新的弱引用變量添加到這個(gè)數(shù)組中,如果沒有的話,就重新創(chuàng)建一個(gè)弱引用數(shù)組,把這個(gè)新的弱引用變量添加到第0個(gè)位置,后面的都置為nil。 其中具體的實(shí)現(xiàn)過程可以在蘋果官網(wǎng)查看相應(yīng)的源碼實(shí)現(xiàn)。

清除weak變量,同時(shí)設(shè)置置為nil

當(dāng)一個(gè)weak 對(duì)象被dealloc之后,dealloc內(nèi)部會(huì)去調(diào)用弱引用清除的相關(guān)函數(shù),然后調(diào)用weak_clear_no-lock()函數(shù),根據(jù)當(dāng)前指針查找弱引用表,找到當(dāng)前對(duì)象相對(duì)應(yīng)的弱引用數(shù)組,遍歷這個(gè)數(shù)組的所有弱引用指針,分別置為nil.

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

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