isa的结构
isa的结构如图所示:它是一个联合体(union),节约内存空间
![](https://img.haomeiwen.com/i1534714/d43839a825036424.png)
上图中有一个“struct”,struct中有一个ISA_BITFIELD宏定义:
![](https://img.haomeiwen.com/i1534714/268bdf78fb8ae567.png)
nonpointer:表示是否对isa指针开启优化,0:是纯isa指针,1:不止是内对象地址,isa中包含了类信息、对象的引用计数等
has_assoc:关联对象的标志,0:没有,1:存在
has_cxx_dtor:该对象是否有C++或者objc的析构器,如果有析构函数,则需要做析构逻辑,如果没有,则可以更快的释放对象
shiftcls:存储类指针的值,开启指针优化的情况下,在arm64架构中有33位用来存储类指针,x86_64_架构的情况下是44位来存储类指针
magic:用来调试器判断当前对象是真的对象,还是没有初始化的空间
weakly_referenced:志对象是否被指向或者曾经指向一个ARCd的弱变量,没有弱引用的对象可以更快释放
deallocating:标志对象是否正在释放内存
has_sidetable_rc:当对象引⽤技术⼤于 10 时,则需要借⽤该变量存储进位
extra_rc:当表示该对象的引用计数值,实际上是引用计数值减一,例如:如果对象的引用计数值为10,那么extra_rc为9,如果对象的引用计数值大于10,则需要使用到has_sidetable_rc
dealloc流程:dealloc -> _objc_rootDealloc -> rootDealloc -> objc_object
![](https://img.haomeiwen.com/i1534714/0fbe0d429230babf.png)
![](https://img.haomeiwen.com/i1534714/068c1b1f96291549.png)
判断所有的属性isa.nonpointer && !isa.weakly_referenced && !isa.has_assoc && !isa.has_cxx_dtor && !isa.has_sidetable_rc
![](https://img.haomeiwen.com/i1534714/131f0fb5df1aaa19.png)
object_dispose:进行释放
![](https://img.haomeiwen.com/i1534714/6a0695ec442da1ee.png)
下面进行各种标识位数据的释放
![](https://img.haomeiwen.com/i1534714/bccc7bf7625ffba4.png)
isa关联类:作用就是关联类,是类的一个属性,是calloc的一个指针和类关联起来,通过newisa.shiftcls = (uintptr_t)cls >> 3,isa= newisa;
![](https://img.haomeiwen.com/i1534714/ef416126d4108b5a.png)