美文网首页
weak 的实现原理

weak 的实现原理

作者: Bepawbikvy | 来源:发表于2019-08-12 15:26 被阅读0次

    weak 关键字的作用弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为nil.

    整个系统中存在很多个对象,这些对象都可能会被弱引用,那么我们需要一个容器来容纳这些被弱引用的对象,如数组,在此将这个容器的数据结构标识为objectContainerDataStructure;

    一个对象可能会被多次弱引用,当这个对象被销毁时,我们需要找到这个对象的所有弱引用,所以我们需要将这些弱引用的地址(即指针)放在一个容器里,如数组,在此将这些弱引用的地址的数据结构标识为pointerContainerDataStructure;

    当对象不再被强引用时需销毁时,我们需要通过这个对象在 objectContainerDataStructure 找到其对应的pointerContainerDataStructure,进而找到这个对象的所有弱引用,将其置为nil,

    通过上面的步骤,我们大概可以得出这么一个数据结构:

    1、pointerContainerDataStructure 仅仅只是容纳一个对象的所有弱引用的地址,所以用数组即可;
    2、objectContainerDataStructure 是一个 key-value 数据结构,将对象作为 key,对象的内存地址是最好的选择;
    3、在 iOS 中常用的 key-value 数据结构就是字典 Dictionary ,在这里我们的key 是一个数值对象,value 则是一个数值数组对象,可以用哈希表实现。

    总结:
    weak表是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址数组。

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

    相关文章

      网友评论

          本文标题:weak 的实现原理

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