1. isa指针
-
实例对象(
instance)的isa指针,指向类对象(class)当调用
对象方法时,通过instance的isa找到class, 最后找到对象方法的实现进行调用 -
类对象(
class)的isa指向元类对象(meta-class)当调用
类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用。
2. class对象的superclass指针
- 当子类的
instance对象要调用父类的对象方法时,会先通过isa找到子类的类对象class,然后通过superclass指针找到父类的class,最后找到对象方法的实现进行调用。
3. meta-class对象的superclass指针
- 当子类的
class对象要调用父类的类方法时,会先通过isa找到子类meta-class,然后通过superclass找到父类的meta-class,最后找到类方法的实现进行调用。
4. isa、superclass总结,如下图所示,接下来一步一步进行分析:
-
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对象。 为什么会发生这种情况?在编译器中进行验证:- 首先给NSObject创建一个分类,.m中只实现test对象方法
- 创建一个Person类,继承自NSObject,然后用Person类对象调用test类方法。得到的结果为
-test!调用类方法,竟然执行了同名的对象方法,简直太不可思议了。 - 所以这也验证了:基类的meta-class的
superclass指针指向基类的class对象。原因是因为在OC中执行方法时,都是给对象发送消息,并不会告诉编译器是执行对象方法,还是类方法,所以就导致了这样的情况发生。
- 首先给NSObject创建一个分类,.m中只实现test对象方法
-
instance调用对象方法的轨迹:isa找到class,方法不存在,就通过superclass找父类。
-
class调用类方法的轨迹:isa找meta-class,方法不存在,就通过superclass找父类。