类的底层探究(isa,superclass)

objc_object & objc_class的区别

  1. objc_object对应对象,是对象在底层的的数据结构
  2. objc_class对应,是在底层的数据结构
  3. idobjc_object指针别名
typedef struct objc_object *id;`
复制代码
  1. classobjc_class指针别名
typedef struct objc_class *Class;
复制代码
  1. objc_class继承于objc_object,万物皆对象
struct objc_class : objc_object {
复制代码

isa

源码分析

探究objc_object,我们知道objc_object在内存中由isa_t isa成员变量构成。
查看isa_t的源码

union isa_t {
    uintptr_t bits;

private:
    Class cls;

public:
#if defined(ISA_BITFIELD)
    struct {
        ISA_BITFIELD;  // defined in isa.h
    };
#endif
};

复制代码
  1. isa是个联合体(共用体)
  2. isa在新版内存优化后,通过位域的方式,由原来64位单纯作为类指针变为剩余空间可以存放其它信息。例如在x86架构下,中间44位是存放类指针地址,其它为存放了关联对象信息、弱引用、散列表等信息,更大限度的节省内存空间
  3. 其中ISA_MASK作为掩码,在ISA_BITFIELD位域的冗余信息中过滤出shiftcls,类指针的值.
define ISA_MASK        0x00007ffffffffff8ULL
define ISA_BITFIELD
      uintptr_t nonpointer        : 1;
      uintptr_t has_assoc         : 1; 
      uintptr_t has_cxx_dtor      : 1;
      uintptr_t shiftcls          : 44; 
      uintptr_t magic             : 6; 
      uintptr_t weakly_referenced : 1;
      uintptr_t unused            : 1;
      uintptr_t has_sidetable_rc  : 1;
      uintptr_t extra_rc          : 8
复制代码

我们可以看到他们的流程

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享