isa指针
instance对象的isa指向class对象,当调用对象方法时,通过instance对象的isa找到class,最后找到对象方法的实现进行调用。
class对象的isa指向meta-class,当调用类方法时,通过class对象的isa找到meta-class,最后找到类方法的实现进行调用。
//调用对象方法 objc_msgSend(obj,sel_registerName("objMethodName")) //调用类方法 objc_msgSend(objc_getClass("className"), sel_registerName("classMethodName"))
假如存在以下继承关系: Stundent->Person->NSObject。
superclass指针
当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到相应的对象方法进行调用。
当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用。
总结
- 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找父类
如图讲解