新版的objc_object中
struct objc_object {
isa_t isa;
}
在构建对象时调用alloc方法 会对isa_t赋值
inline void objc_object::initIsa(Class cls,boolnonpointer,boolhasCxxDtor)
{
if(!nonpointer) {
isa.cls = cls;
}else{
isa_t newisa(0);
//# define ISA_MAGIC_VALUE 0x001d800000000001ULL
newisa.bits = ISA_MAGIC_VALUE;//现对bits进行初始赋值
newisa.has_cxx_dtor = hasCxxDtor;
newisa.shiftcls = (uintptr_t)cls >>3;//走到这一步会根据cls的地址更新bit中的数据(因为isa_t是属于联合体(union)类型)那么指向类的地址就保存到了bits中,在以后想要获取类的地址时可以通过ISA()这个方法进行获取,在objc_object结构体ISA()方法中通过return (Class)(isa.bit & ISA_MASK)进行 位与 运算得到指向类结构体的地址进行操作
#define ISA_MASK 0x00007ffffffffff8ULL
isa = newisa;
}
}
网友评论