isa
- 在 arm64 架构之前,isa 就是一个普通的指针,存储着 Class、Meta-Class 对象的内存地址
- 从 arm64 架构开始,对 isa 进行了优化,变成了一个共用体 (union) 结构,还使用位域来存储更多的信息
isa_t 共用体
union isa_t {
uintptr_t bits;
private:
// Accessing the class requires custom ptrauth operations, so
// force clients to go through setClass/getClass by making this
// private.
Class cls;
public:
struct {
uintptr_t nonpointer : 1;
uintptr_t has_assoc : 1;
uintptr_t has_cxx_dtor : 1;
uintptr_t shiftcls : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/
uintptr_t magic : 6;
uintptr_t weakly_referenced : 1;
uintptr_t unused : 1;
uintptr_t has_sidetable_rc : 1;
uintptr_t extra_rc : 19
};
};
相关位域
- nonpointer
- 0:代表普通的指针,存储着 Class、Meta-Class 对象的内存地址
- 1:代表优化过,使用位域存储更多的信息
- has_assoc
- has_cxx_dtor
- 是否有 C++ 的析构函数(.cxx_destruct),如果没有,释放时会更快
- shiftcls
- 存储着 Class、Meta-Class 对象的内存地址信息
- magic
- weakly_referenced
- deallocating
- extra_rc
- has_sidetable_rc
- 引用计数器是否过大无法存储在isa中。如果为1,那么引用计数会存储在一个叫SideTable的类的属性中