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找父类。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END