实际上是三种方案的结合
- 1.TaggedPointer(针对类似于
NSNumber
的小对象类型) - 2.NONPOINTER_ISA(64位系统下)
- 第一位的
0
或1
代表是纯地址型isa
指针,还是NONPOINTER_ISA
指针。 - 第二位,代表是否有关联对象
- 第三位代表是否有
C++
代码。 - 接下来33位代表指向的内存地址
- 接下来有
弱引用
的标记 - 接下来有是否
delloc
的标记....等等
- 第一位的
- 3.散列表(引用计数表、weak表)
SideTables
表在 非嵌入式的64位系统中,有 64张SideTable
表- 每一张
SideTable
主要是由三部分组成。自旋锁
、引用计数表
、弱引用表
。 - 全局的
引用计数
之所以不存在同一张表中,是为了避免资源竞争,解决效率的问题。 引用计数表
中引入了分离锁
的概念,将一张表分拆成多个部分,对他们分别加锁,可以实现并发操作,提升执行效率