- [参考链接]https://www.jianshu.com/p/3e1333880dcd
前面有讲过Object-C的对象分类,里面有提到isa指针,每个类都有其对应的isa指针,如下图所示
-
上面红色的虚线箭头可以简单地表示其对应关系
- instance的isa指向class
当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用 - class的isa指向meta-class
当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
- instance的isa指向class
-
class对象的superclass指针
既然是superclass,那就给出一些具有继承关系的对象,具体的继承关系如下所示:- JCStudent继承自JCPerson 关键代码
@interface JCStudent : JCPerson<NSCoding>
- JCPerson继承自NSObject 关键代码
@interface JCPerson : NSObject
- JCStudent继承自JCPerson 关键代码
-
上面红色的实线箭头可以简单地表示其对应关系(class对象的superclass指针指向的是其父类的class对象)
- 当JCStudent的instance对象要调用Person的对象方法时,会先通过isa找到JCStudent的class,然后通过superclass找到JCPerson的class,最后找到对象方法的实现进行调用
-
meta - class对象的superclass指针
如上继承关系不变,具体如下所示:
-
上面红色的实线箭头可以简单地表示其对应关系(meta-class对象的superclass指针指向的是其父类的meta-class对象)
- 当JCStudent的class要调用JCPerson的类方法时,会先通过isa找到JCStudent的meta-class,然后通过superclass找到JCPerson的meta-class,最后找到类方法的实现进行调用
-
isa/superclass总结简单的总结
- 图解如下(对应上述的继承关系,Subclass类似JCStudent,Superclass类似JCPerson,Rootclass类似NSObject)
- 文字解释如下
a) instance对象的isa指向其对应的class对象
b) class对象的isa指向其对应的meta-class对象
c) meta-class的isa指向其基类的meta-class对象(上图右侧虚线所示)
d) class对象的superclass指向其父类的class对象
※如果没有父类,superclass指向为nil
e)meta-class的superclass指向其父类的meta-class对象
※基类的meta-class的superclass指向其class对象(上图右上方箭头所示)
f)instance调用对象方法的轨迹
※通过isa找到其class对象,如果方法不存在,那么就通过class对象的superclass找其父类,依次向上寻找,最终如果没有找到,报错:unrecognized selector sent to instance
g)class调用类方法的轨迹
※通过isa找到其meta-class对象,如果方法不存在,那么就用过meta-class对象的superclass找其父类,依次向上寻找,如果meta-class的基类中依然没有方法,则调用meta-class对应的class对象寻找,如果依旧没有,报错:unrecognized selector sent to instance(上图右上返回的箭头所示)
网友评论