weak修饰符修饰的变量在被使用的时候会涉及到表查询,消耗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 函数把第二个参数的赋值对象的地址作为键值,将第一个参数的带有 __weak 修饰的变量的地址注册到 weak 表中。如果第二个参数为 0,把变量从weak表中删除。
这里边涉及到了查表的操作,消耗cpu性能,所以最好只在避免循环引用的时候才去使用__weak修饰符。
网友评论