OC底层->isa、superclass和class的结构

621 阅读1分钟

实例对象、类对象与元类对象的关系

  • 实例对象
    • isa
    • 其他成员变量
    • 通过isa找到类对象
  • 类对象
    • isa
    • superclass
    • 属性、对象方法、协议、成员变量
    • 通过isa找到元类对象
  • 元类对象
    • isa
    • superclass
    • 类方法 image.png

class对象的superclass指针

  • Student继承自Person
  • Student的实例对象(isa)-> Student的类对象(superclass)-> Person的类对象,这样Student就可以调用Person的类方法了。 image.png

image.png

meta-class对象的superclass指针

  • 也是差不多的通过isa和superclass的互相配合找到元类对象,这样就可以调用类方法了。 image.png

我认为OC的继承的实现原理就是这样的。

总结 isa、superclass

  • instance的isa指向class
  • class的isa指向meta-class
  • meta-class的isa指向基类的meta-class
  • class的superclass指向父类的class
    • 如果没有父类,superclass指针为nil
  • meta-class的superclass指向父类的meta-class
    • 基类的meta-class的superclass指向基类的class
  • instance调用对象方法的轨迹
    • isa找到class,方法不存在,就通过superclass找父类
  • class调用类方法的轨迹
    • isa找meta-class,方法不存在,就通过superclass找父类
      image.png

class的结构

  • isa指针进行一次位运算 & 才能得到真正的地址,并不是 isa 指针直接使用的 image.png

image.png

窥探struct objc_class的结构

  • bits也是&一个位运算找到方法列表等信息 611015-6fe641e1f0fddefd.png

  • 源码bits image.png

  • data是bits&FAST_DATA_MASK image.png

  • 找到 class_rw_t 结构体 image.png

  • 里面有methods、properties和protocols image.png

  • 找到class_ro_t 里面是baseProtocol和baseproperties image.png