創(chuàng)建weak對象obj1
NSObject *obj = [[NSObject alloc] init];
id __weak obj1 = obj;
weak 實(shí)現(xiàn)原理的概括
runtime維護(hù)一個weak表烤送,用來存儲某個對象的所有weak指針樱拴。weak表其實(shí)是一個hash表寝凌,key是對象的地址狮含,value內(nèi)部實(shí)現(xiàn)是一個weak_table_t的結(jié)構(gòu)體顽悼,存儲了某個對象相關(guān)的所有弱引用信息。
weak 的實(shí)現(xiàn)原理可以概括一下三步:
1几迄、初始化時:runtime會調(diào)用objc_initWeak函數(shù)蔚龙,初始化一個新的weak指針指向?qū)ο蟮牡刂贰?/p>
2、添加引用時:objc_initWeak函數(shù)會調(diào)用 objc_storeWeak() 函數(shù)映胁, objc_storeWeak() 的作用是更新指針指向木羹,創(chuàng)建對應(yīng)的弱引用表。先后調(diào)用a解孙、weak_unregister_no_lock():用來解除weak指針的綁定b坑填、weak_register_no_lock():添加與weak指針的綁定。
3弛姜、一個對象的引用計數(shù)變成0后會被釋放脐瑰。釋放時,調(diào)用clearDeallocating函數(shù)廷臼。clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組苍在,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設(shè)為nil,最后把這個entry從weak表中刪除荠商,最后清理對象的記錄
objc_clear_deallocating該函數(shù)的動作如下:
1寂恬、從weak表中獲取廢棄對象的地址為鍵值的記錄
2、將廢棄對象的weak指針地址莱没,賦值為nil
3初肉、將weak表中該記錄刪除
4、從引用計數(shù)表中刪除廢棄對象的地址為鍵值的記錄
參考鏈接:
weak底層解析