iOS底层总结-isa和superclass指针指向哪里?

1. isa指针

  1. 实例对象(instance)的isa指针,指向类对象(class

    当调用对象方法时,通过instance的isa找到class, 最后找到对象方法的实现进行调用

  2. 类对象(class)的isa指向元类对象(meta-class

    当调用类方法时,通过classisa找到meta-class,最后找到类方法的实现进行调用。
    image.png

2. class对象的superclass指针

  • 当子类的instance对象要调用父类的对象方法时,会先通过isa找到子类的类对象class,然后通过superclass指针找到父类的class,最后找到对象方法的实现进行调用。
    image.png

3. meta-class对象的superclass指针

  • 当子类的class对象要调用父类的类方法时,会先通过isa找到子类meta-class,然后通过superclass找到父类的meta-class,最后找到类方法的实现进行调用。
    image.png

4. isasuperclass总结,如下图所示,接下来一步一步进行分析:

image.png

  1. instanceisa指向class
    image.png

  2. classisa指向meta-class
    image.png

  3. meta-classisa指向基类的meta-class
    image.png

  4. classsuperclass指针指向父类的class。如果没有父类,superclass指针为nil。
    image.png

  5. meta-classsuperclass指针指向父类的meta-class
    image.png
    基类的meta-class的superclass指针指向基类的class对象。 为什么会发生这种情况?在编译器中进行验证:

    1. 首先给NSObject创建一个分类,.m中只实现test对象方法
      image.png
      image.png
    2. 创建一个Person类,继承自NSObject,然后用Person类对象调用test类方法。得到的结果为-test!调用类方法,竟然执行了同名的对象方法,简直太不可思议了。
      image.png
    3. 所以这也验证了:基类的meta-class的superclass指针指向基类的class对象。原因是因为在OC中执行方法时,都是给对象发送消息,并不会告诉编译器是执行对象方法,还是类方法,所以就导致了这样的情况发生。
  6. instance调用对象方法的轨迹:isa找到class,方法不存在,就通过superclass找父类。
    image.png

  7. class调用类方法的轨迹:isa找meta-class,方法不存在,就通过superclass找父类。
    image.png

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