weak修飾符修飾的變量在被使用的時(shí)候會(huì)涉及到表查詢,消耗cpu性能。
id __weak obj1 = obj; // 變量obj由strong修飾
/* 編譯器模擬代碼 */
id obj1;
objc_initWeak(&obj1, obj);
objc_destoryWeak(&obj1);
等同如下
/* 編譯器模擬代碼 */
id obj1;
obj1 = 0;
objc_storeWeak(&obj1, obj);
objc_storeWeak(&obj1, 0);
objc_storeWeak 函數(shù)把第二個(gè)參數(shù)的賦值對(duì)象的地址作為鍵值,將第一個(gè)參數(shù)的帶有 __weak 修飾的變量的地址注冊(cè)到 weak 表中。如果第二個(gè)參數(shù)為 0,把變量從weak表中刪除。
這里邊涉及到了查表的操作,消耗cpu性能,所以最好只在避免循環(huán)引用的時(shí)候才去使用__weak修飾符。