在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址
从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息
为什么要&ISA_MASK来获取类或元类的地址?
因为从arm64位开始,isa里面存储各种信息,是一个共用体,其中shiftcls 33位才是用来存放地址。通过&ISA_MASK就可以将33位的地址值取出来。
isa参数详解
- nonpointer:
0,代表普通的指针,存储着Class、Meta-Class对象的内存地址
1,代表优化过,使用位域存储更多的信息 - has_assoc:是否有设置过关联对象,如果没有,释放时会更快
- has_cxx_dtor:是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快
- shiftcls:存储着Class、Meta-Class对象的内存地址信息
- magic:用于在调试时分辨对象是否未完成初始化
- weakly_referenced:是否有被弱引用指向过,如果没有,释放时会更快
- deallocating:对象是否正在释放
- extra_rc:表示该对象的引用计数值,实际上是引用计数值减 1,例如,如果对象的引用计数为 10,那么 extra_rc 为 9。如果引用计数大于 10,则需要使用到下面的 has_sidetable_rc。
- has_sidetable_rc:当对象引用计数大于 10 时,则has_sidetable_rc 的值为 1,那么引用计数会存储在一个叫 SideTable 的类的属性中,这是一个散列表。