Object - C isa/superclass 指针

  • [参考链接]https://www.jianshu.com/p/3e1333880dcd
    前面有讲过Object-C的对象分类,里面有提到isa指针,每个类都有其对应的isa指针,如下图所示
Object - C isa/superclass 指针_第1张图片
isa.png
  • 上面红色的虚线箭头可以简单地表示其对应关系
    • instance的isa指向class
      当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
    • class的isa指向meta-class
      当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
  • class对象的superclass指针
    既然是superclass,那就给出一些具有继承关系的对象,具体的继承关系如下所示:
    • JCStudent继承自JCPerson 关键代码
      @interface JCStudent : JCPerson
    • JCPerson继承自NSObject 关键代码
      @interface JCPerson : NSObject
Object - C isa/superclass 指针_第2张图片
class_isa.png
  • 上面红色的实线箭头可以简单地表示其对应关系(class对象的superclass指针指向的是其父类的class对象)
    • 当JCStudent的instance对象要调用Person的对象方法时,会先通过isa找到JCStudent的class,然后通过superclass找到JCPerson的class,最后找到对象方法的实现进行调用
  • meta - class对象的superclass指针
    如上继承关系不变,具体如下所示:
Object - C isa/superclass 指针_第3张图片
meta-class_isa.png
  • 上面红色的实线箭头可以简单地表示其对应关系(meta-class对象的superclass指针指向的是其父类的meta-class对象)

    • 当JCStudent的class要调用JCPerson的类方法时,会先通过isa找到JCStudent的meta-class,然后通过superclass找到JCPerson的meta-class,最后找到类方法的实现进行调用
  • isa/superclass总结简单的总结

    • 图解如下(对应上述的继承关系,Subclass类似JCStudent,Superclass类似JCPerson,Rootclass类似NSObject)
Object - C isa/superclass 指针_第4张图片
isa/superclass.png
  • 文字解释如下
    a) instance对象的isa指向其对应的class对象
    b) class对象的isa指向其对应的meta-class对象
    c) meta-class的isa指向其基类的meta-class对象(上图右侧虚线所示)
    d) class对象的superclass指向其父类的class对象
    ※如果没有父类,superclass指向为nil
    e)meta-class的superclass指向其父类的meta-class对象
    ※基类的meta-class的superclass指向其class对象(上图右上方箭头所示)
    f)instance调用对象方法的轨迹
    ※通过isa找到其class对象,如果方法不存在,那么就通过class对象的superclass找其父类,依次向上寻找,最终如果没有找到,报错:unrecognized selector sent to instance
    g)class调用类方法的轨迹
    ※通过isa找到其meta-class对象,如果方法不存在,那么就用过meta-class对象的superclass找其父类,依次向上寻找,如果meta-class的基类中依然没有方法,则调用meta-class对应的class对象寻找,如果依旧没有,报错:unrecognized selector sent to instance(上图右上返回的箭头所示)

你可能感兴趣的:(Object - C isa/superclass 指针)