isa_t

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
    • 里面存储的值是引用计数器减1
  • has_sidetable_rc
    • 引用计数器是否过大无法存储在isa中。如果为1,那么引用计数会存储在一个叫SideTable的类的属性中