關(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.