美文网首页
weak实现原理

weak实现原理

作者: ChancePro | 来源:发表于2018-08-28 11:50 被阅读4次

    weak弱引用,修饰的对象引用计数不会+1,在引用计数为0时,把指针置为nil,避免野指针。通常用来修饰delegate、block避免循环引用。
    Runtime维护了一个weak表,weak表是一个哈希表,key是所指对象的地址,value是weak指针的地址数组。

    1. 初始化时:runtime会调用objc_initWeak函数,该函数会初始化一个新的weak指针指向对象的地址。
    2. 添加引用时:objc_initWeak函数会调用objc_storeWeak()函数,该函数会更新指针指向。
    3. 释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

    weak指向的对象被释放时,如何处理weak指针?

    1. 调用objc_release
    2. 执行dealloc
    3. 在dealloc中调用objc_rootDealloc函数
    4. 在objc_rootDealloc中调用objc_dispose函数
    5. 调用objc_destructInstance
    6. 调用objc_clear_deallocating,从weak表中获取废弃对象的地址为键值的记录,将包含在记录中的所有附有weak修饰变量的地址,赋值为nil,将weak表中该记录删除,从引用技术表中删除废弃对象的地址为键值得记录。
    weak与assign的区别

    weak修饰的对象销毁后,指针会自动置为nil。assign不会,可能会造成野指针。
    assign一般用于修饰基本数据类型。

    相关文章

      网友评论

          本文标题:weak实现原理

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