深入理解 __weak 修饰符

2018-09-21  本文已影响56人  小码农_gjw

前言

刚开始接触 weak 修饰符时,是在使用 tableViewdelegate 属性时,当时也就是仅仅知道在设置代理 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表中的数据。

不知道理解的是否正确,如有不正确的地方还请各位大神指点

上一篇下一篇

猜你喜欢

热点阅读