image.png

  • instanceisa 指针指向 class
  • classisa 指向 meta-class
  • meta-classisa 指针指向基类的 meta-class
  • classsuperclass 指针指向父类的 class
    如果没有父类,superclass 指针为 nil
  • meta-classsuperclass 指针指向父类的 meta-class
  • 基类的 meta-classsuperclass 指针指向基类的 class

instance 调用对象方法的轨迹
通过 isa 指针找到 class,方法不存在,就通过 superclass 指针找父类,如果父类方法不存在,就通过 superclass 指针找根类(也就是 NSObject),如果根类方法不存在,就会报 unrecognized selector 错误;

class 调用类方法的轨迹
通过 isa 指针找 meta-class,方法不存在,就通过 superclass 找父类的 meta-class,如果父类的 meta-class 方法不存在,就通过 superclass 指针找根类(也就是 NSObject)的 meta-class,如果根类的 meta-class 方法不存在,就通过 superclass 找根类的 class,如果根类方法不存在,就会报 unrecognized selector 错误;

image.png
image.png

1
2
p/x (long)person->isa
p/x personClass

64bit 开始,isa 需要进行一次位运算,才能计算出真实地址;说明,实例对象 isa 指针里面存放的地址值应该是这个类对象的。

1
2
p/x (long)person->isa
p/x studentClass->superclass