美文网首页程序员
Object - C isa/superclass 指针

Object - C isa/superclass 指针

作者: JustEverOnce | 来源:发表于2018-12-06 17:45 被阅读3次
    isa.png
    • 上面红色的虚线箭头可以简单地表示其对应关系
      • instance的isa指向class
        当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
      • class的isa指向meta-class
        当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
    • class对象的superclass指针
      既然是superclass,那就给出一些具有继承关系的对象,具体的继承关系如下所示:
      • JCStudent继承自JCPerson 关键代码
        @interface JCStudent : JCPerson<NSCoding>
      • JCPerson继承自NSObject 关键代码
        @interface JCPerson : NSObject
    class_isa.png
    • 上面红色的实线箭头可以简单地表示其对应关系(class对象的superclass指针指向的是其父类的class对象)
      • 当JCStudent的instance对象要调用Person的对象方法时,会先通过isa找到JCStudent的class,然后通过superclass找到JCPerson的class,最后找到对象方法的实现进行调用
    • meta - class对象的superclass指针
      如上继承关系不变,具体如下所示:
    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)
    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 指针

        本文链接:https://www.haomeiwen.com/subject/ckbmcqtx.html