美文网首页
深入理解 __weak 修饰符

深入理解 __weak 修饰符

作者: 小码农_gjw | 来源:发表于2018-09-21 16:19 被阅读56次

    前言

    刚开始接触 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表中的数据。

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

    相关文章

      网友评论

          本文标题:深入理解 __weak 修饰符

          本文链接:https://www.haomeiwen.com/subject/ckfznftx.html