NSObject底层探究之-isa(一)

348 阅读1分钟

调试环境

  • 源 码:objc4-818.2
  • cpu架构:x86_64

isa是什么

isa是存储了对象的引用计数、类信息等一系列信息的位域数据。以x86_64架构下的源码为例:

#   define ISA_BITFIELD                                                        \
      uintptr_t nonpointer        : 1;                                         \
      uintptr_t has_assoc         : 1;                                         \
      uintptr_t has_cxx_dtor      : 1;                                         \
      uintptr_t shiftcls          : 44; /*MACH_VM_MAX_ADDRESS 0x7fffffe00000*/ \
      uintptr_t magic             : 6;                                         \
      uintptr_t weakly_referenced : 1;                                         \
      uintptr_t unused            : 1;                                         \
      uintptr_t has_sidetable_rc  : 1;                                         \
      uintptr_t extra_rc          : 8

下图是x86_64架构下的isa位域示意图

isa位域结构图——x86_64.001.png

isa位域各数据位说明

  • nonpointer : 是否是纯粹的isa指针,为0代表为纯粹的isa,纯粹的isa指针代表isa位域里只保存了指向类的指针(即shiftcls);为1代表非纯粹的isa,非纯粹的isa除了有指向类的指针shiftcls,还有has_assocextra_rc等其他信息;位于第0个比特位,占用1个bit。
  • has_assoc : 该对象是否有关联对象,为0代表没有关联对象,为1代表有关联对象;位于第1个比特位,占用1个bit。
  • has_cxx_dtor : 该对象是否有C++的析构函数;位于第2个比特位,占用1个bit。
  • shiftcls : 指向该对象所属类的地址;位于第3-46个比特位,占用44个bit。
  • magic : 魔数,用于判断该对象是否已被初始化,0x3b代表已被初始化;位于第47-52个比特位,占用6个bit。
  • weakly_referenced : 是否被弱引用;位于第53个比特位,占用1个bit。
  • unused : 占位;位于第54个比特位,占用1个bit。
  • has_sidetable_rc : 是否将引用计数存至sidetable,当extra_rc存储的引用计数溢出时,需要使用sidetable存储引用计数时,该位的值为1,反之为0;位于第55个比特位,占用1个bit.
  • has_sidetable_rc : 引用计数;位于第56-63个比特位,占用8个bit