runtime中objc_object内部结构解析

2019-03-22  本文已影响0人  d5cbd4f07363

新版的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; 

          }

}

上一篇 下一篇

猜你喜欢

热点阅读