美文网首页
weak理解

weak理解

作者: 小人物_b | 来源:发表于2019-01-16 11:50 被阅读0次

    创建weak对象obj1

    NSObject *obj = [[NSObject alloc] init];
    id __weak obj1 = obj;
    

    weak 实现原理的概括

    runtime维护一个weak表,用来存储某个对象的所有weak指针。weak表其实是一个hash表,key是对象的地址,value内部实现是一个weak_table_t的结构体,存储了某个对象相关的所有弱引用信息。


    图片.png

    weak 的实现原理可以概括一下三步:

    图片.png

    1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。

    2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。先后调用a、weak_unregister_no_lock():用来解除weak指针的绑定b、weak_register_no_lock():添加与weak指针的绑定。

    3、一个对象的引用计数变成0后会被释放。释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录

    objc_clear_deallocating该函数的动作如下:
    1、从weak表中获取废弃对象的地址为键值的记录
    2、将废弃对象的weak指针地址,赋值为nil
    3、将weak表中该记录删除
    4、从引用计数表中删除废弃对象的地址为键值的记录

    参考链接:
    weak底层解析

    相关文章

      网友评论

          本文标题:weak理解

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