1、isa 指针
在 arm64 架构之前,isa 就是一个普通的指针,存储着 Class、Meta-Class 对象的内存地址。从 arm64 架构开始,对 isa 进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息。
共用体:共用同一块内存。
2、结构
isa 指针结构参数解析:
bits:用来存储 struct 里面所有参数的数据。此处的 struct 只是用来注释说明 bits 中存放的哪些内容,可以省略不写。struct 中的后面的参数(如::1),表示占用多少位。
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。
has_sidetable_rc:引用计数器是否过大无法存储在 isa 中。如果为1,那么引用计数会存储在一个叫 SideTable 的类的属性中。
3、问与答
1、对象的 isa 指针指向哪里?
instance 对象的 isa 指针指向 class 对象;
class 对象的 isa 指针指向 meta_class 对象;
meta_class 对象的 isa 指针指向基类的 meta_class 对象。
网友评论