深入理解 __weak 修饰符
2018-09-21 本文已影响56人
小码农_gjw
前言
刚开始接触 weak
修饰符时,是在使用 tableView
的 delegate
属性时,当时也就是仅仅知道在设置代理 delegate
属性时使用weak
修饰符;然后接触了block
,进一步知道了 __weak
可以用来解决循环引用的问题,但对于它的底部实现原理还是不了解。所幸的是在大神的推荐下看了 《Objective-C 高级编程》这本书之后,对weak
有个更深一步的认识。
原理
// 1.声明变量 obj
id obj = [[NSObject alloc] init];
// 2.声明 weak_obj 对象
__weak weak_obj = obj;
// 第2部经过编译器编译后
id weak_obj;
objc_initWeak(&weak_obj, obj); // 初始化 weak_obj
objc_destoryWeak(&weak_obj); // 在作用域结束时,销毁 weak_obj
通过 objc_initWeak
函数初始化 weak_obj
变量,在作用域结束后调用objc_destoryWeak
方法销毁weak_obj
变量。
紧接着objc_initWeak
函数会调用objc_storeWeak
函数
weak_obj = 0; // 将 weak_obj 初始化为 0
objc_storeWeak(&weak_obj, obj); // 将 obj 作为 key,以weak_obj变量的地址(&weak_obj)注册到weak表中
objc_destroyWeak
函数同样的也会调用objc_storeWeak
函数
objc_storeWeak(&weak_obj, 0); // 当 obj 为 0 或者 nil 时,将(&weak_obj)从weak表中删除,并且将其引用计数清空
以上对于 objc_storeWeak
函数的解释有点拗口,我自己的理解是:可以将 weak表 整体最为 value 去考虑,当 obj = nil 时,清空 weak表中的数据。
不知道理解的是否正确,如有不正确的地方还请各位大神指点