4-2 内存管理方案

[引用计数相关] https://juejin.im/post/5b5577cae51d45191853426f
[引用计数原理]http://www.cocoachina.com/ios/20151210/14636.html
iOS系统是怎样对内存进行管理的?以及原理
引用计数? 原理如下 wishing看上面的引用计数原理就够了
1.TaggedPointer 是否支持 1表示支持就是nonpointer_isa
2.NONPOINTER_ISA has_sidetable_rc 对象引用计数过大 就是要使用散列表的方式
3.散列表

NONPOINTER_ISA
32位占用32个0也就是4个字节
64位占用64个0也就是8个字节

2.第一个字节indexed如何是1那么表示这是一个指针型isa 表示的是当前的对象的类对象的地址
如果是1 那么存的不仅是对象的类对象的地址还有一些内存管理方面的数据

占位数 名称 意义
1 bit indexed 0 is raw isa, 1 is non-pointer isa.
1 bit has_assoc 对象拥有或者曾经拥有一个相关的参考。对象没有关联的引用可以释放的更快。
1 bit has_cxx_dtor 对象有一个 C++或者 ARC 的析构函数。没有析构函数的对象可以被释放的更快
33 bit shiftcls 类指针的非零位 Class pointer's non-zero bits.
9 bit magic 等于 0xd2。被调试器用来从没初始化的东西中区分真是的对象
1 bit weakly_referenced 弱引用 对象正被或者曾经被一个自动释放的弱引用变量指向。没有被弱引用的对象能够释放的更快。
1 bit deallocating 对象是否正在被释放
1 bit has_sidetable_rc 对象引用计数过大 需要这个字节保存引用计数的相关内容 散列表
19 bit extra_rc 对象的引用计数是extra_rc 值+1(举例,如果 extra_rc 是5,那么对象的真是引用计数是6)额外的引用计数

散列表的方案是sideTables 是由多个sideTable组合而成的
为什么用多张呢 因为用一张会导致效率问题
使用分离所 可以吧表分开成 多张表 当a,b在不同的表里面时我们就可以进行并发操作
提高效率

怎样实现快速分流?
sideTable本质是一张hash表

你可能感兴趣的:(4-2 内存管理方案)