isa的结构如图所示:它是一个联合体(union),节约内存空间
图(1)上图中有一个“struct”,struct中有一个ISA_BITFIELD宏定义:
图(2)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
dealloc图(1) dealloc图(2)判断所有的属性isa.nonpointer && !isa.weakly_referenced && !isa.has_assoc && !isa.has_cxx_dtor && !isa.has_sidetable_rc
dealloc图(3)object_dispose:进行释放
dispose图(1)下面进行各种标识位数据的释放
图(2)isa关联类:作用就是关联类,是类的一个属性,是calloc的一个指针和类关联起来,通过newisa.shiftcls = (uintptr_t)cls >> 3,isa= newisa;
图(3)
网友评论