__weak修飾符屏积,是我們經(jīng)常用來解決循環(huán)引用的良藥利器湘换,它展現(xiàn)出如此強(qiáng)大的魔力宾舅,我卻一無所知。所以我決定去看一看它的實(shí)現(xiàn)彩倚。
在看了《Objective-C高級編程》一書以后筹我,關(guān)于__weak的實(shí)現(xiàn)理念,我用簡單的方式概括一下為:
id obj = 1;
id __weak obj1 = obj;
/*編譯器模擬代碼*/
id obj1;
obj1 = 0;
objc_storeWeak(&obj1,obj);
objc_storeWeak(&obj1,0);
關(guān)于objc_storeWeak的底層實(shí)現(xiàn)呢署恍,下次再看崎溃。
底層實(shí)現(xiàn)理念為將obj的地址作為鍵值,然后將__weak修飾符修飾的obj1的地址注冊到weak表中盯质。
可以簡單的看作是{&obj:&obj1}袁串,便于理解概而。
如果第二個(gè)參數(shù)是0,則把變量的地址從weak表中刪除囱修。
由于一個(gè)對象可以同時(shí)同時(shí)賦值給多個(gè)__weak修飾符的變量中赎瑰,所以對于一個(gè)鍵值,可注冊多個(gè)變量的地址破镰。
__weak修飾符所修飾的變量地址作為鍵值是注冊到一個(gè)weak表中的餐曼,
這里為了便于理解,可以簡單的看作是{&obj:@[&obj1,&obj2,&obj3......]}鲜漩。
釋放對象時(shí)源譬,程序的動(dòng)作運(yùn)行:
1.先調(diào)用objc_release
2.因?yàn)橐糜?jì)數(shù)為0所以執(zhí)行dealloc
3._objc_rootDealloc
4.object_dispose
5.objc_destructInstance
6.objc_clear_deallocating
當(dāng)obj將要被被廢棄的時(shí)候,會通過obj的地址在weak表找尋到所對應(yīng)的所有__weak修飾符變量的地址孕似,賦值為nil踩娘,然后將記錄刪除,再從引用計(jì)數(shù)表中刪除廢棄對象的地址為鍵值的記錄喉祭。
但是由此可知养渴,如果大量的使用附有__weak修飾符的變量,則會消耗相應(yīng)的CPU資源泛烙,所以良策是只在需要避免循環(huán)引用時(shí)使用__weak修飾符理卑。