调试环境
- 源 码: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位域各数据位说明
nonpointer: 是否是纯粹的isa指针,为0代表为纯粹的isa,纯粹的isa指针代表isa位域里只保存了指向类的指针(即shiftcls);为1代表非纯粹的isa,非纯粹的isa除了有指向类的指针shiftcls,还有has_assoc、extra_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