美文网首页
关于引用计数和weak --- SideTable理解

关于引用计数和weak --- SideTable理解

作者: 晨曦中的花豹 | 来源:发表于2022-01-12 15:21 被阅读0次

SideTable 之上是个SideTables,里面存储着SideTable
具体有关SideTables请看runtime(二) SideTables

这个表是由runtime来进行维护的,

其实是站在局外来对创建的对象进行统一的管理(并不是在对象本身内部对自己的引用计数和weak引用进行管理的(引用计数在超出对象isa引用计数存储上限的情况下,没有超出的话,对象本身是可以管理自己的引用计数的)),我之前的认识是对象本身会管理自己的引用计数以及弱引用表

SideTable 存储有两个重要的结构

1. refcnts
2. weak_table
refcnts 中就保存了对象的引用计数(这里是超出了对象isa中引用计数最大值的对象),
refcnts 中有个数组,元素就是(对象地址,引用计数)类似swift中元组,
所以每一个SideTable中是存储了多个对象的引用计数的
引用计数变化的流程是:
1.通过对象地址,找到对应的 SideTable;
2.通过对象地址找到(对象地址,引用计数);
3.对引用计数+1,-1操作
weak_table 中是保存对象的weak引用
weak_table 中也有个数组,元素是个(对象地址,弱引用此对象的指针数组)weak_entry_t,
其中这个弱引用数组每一个元素就是弱指针地址
所以当对象销毁的时候,weak变为nil的流程是
1.通过对象地址,找到对应的 SideTable;
2.继续通过对象地址,找到 weak_table 中对应的weak_entry_t;
3.遍历弱引用表,将其中的弱引用指针变为nil;
4.将weak_entry_t从数组中移除

通过上述,我知道了,引用计数和weak引用是分别存储的,我之前一直认为他们是这样的结构:{对象地址:{引用计数:10,weakList:[0x1,0x2]}},其实他们是{对象地址:{引用计数:10}},{对象地址:{weakList:[0x1,0x2]}},关于为什么不用上边的结构,我就不太知道了,主要是通过上边的文章更新了自己的认识

相关文章

  • 关于引用计数和weak --- SideTable理解

    SideTable 之上是个SideTables,里面存储着SideTable具体有关SideTables请看ru...

  • iOS SideTables与retain,release

    SideTables 在阅读关于弱引用表weak table相关源码时,我们大概了解了一些关于SideTable的...

  • iOS基础 对Strong和Weak的理解

    之前对Strong和Weak的理解并不够深,只知道Strong是强引用,对象的引用计数加一,weak是弱引用,防止...

  • iOS SideTable

    SideTable主要存放了OC对象的引用计数和弱引用相关信息。定义如 下: SideTable的定义很清晰有三个...

  • weak底层实现原理

    一、weak基本用法 weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对...

  • iOS weak修饰属性的原理

    一、weak基本用法 weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对...

  • iOS 内存管理 (4):Weak

    一、weak基本用法 weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对...

  • copy/strong/weak/assign的区别

    strong和weak 1.strong用来修饰对象,表示强引用,修饰的对象引用计数+12.weak同样用来修饰对...

  • iOS weak 原理

    一、weak 基本用法weak 是弱引用,用 weak 来修饰、描述所引用对象的计数器并不会增加,而且 weak ...

  • iOS 内存管理(六)-weak原理

    一、基本用法 weak 是弱引用,用 weak 来修饰、描述所引用对象的计数器并不会增加,而且 weak 会在引用...

网友评论

      本文标题:关于引用计数和weak --- SideTable理解

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