调试环境
- 源 码: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