isa和SuperClass

164 阅读2分钟

instance of Subclass  :子类的实例对象

Subclass(class):子类的类对象

Subclass (meta):子类的元类对象

instance of Superclass : 父类的实例对象

Supercalss (class)  :  父类的类对象

Superclass  (meta) :  父类的元类对象

instance of Root class  :  根类的实例对象(基类的实例对象)

Root class( class )   :根类的类对象

Root class (meta)         :    根类的元类对象

根类、基类 一般都是指:NSObject 

instance(实例)对象的isa指向其`class`对象;

class对象的`isa`指针指向 `meta-class`(元类)对象

meta-class(元类)对象的isa指针指向基类(一般是指`NSObject`)的`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找父类
但是被KVO监听的对象除外,因为KVO监听会在运行时生成新的派生类。isa指针指向的是这个衍生类。

superclass 指针指向:

Student类继承自Person;Person继承自NSObject 那么各类对象superclass指向?

类对象的superclass指针指向父类对象

<1> class对象的superclass指向父类的class对象(如果这个class对象没有父类,那么它的superclass指针为空)

<2> meta-class对象的superclass指向父类的meta-class对象,  根类的meta-class对象的superclass指向根类自己的class对象

instance 调用对象方法的轨迹 先通过 isa 指针找到实例对象的类对象,查看类对象中是否存在这个方法,存在就直接展开调用;如果不存在,需要通过类对象的superclass指针找到类对象父类,查看父类中是否存在这个方法,存在就直接展开调用;不存在就找父类父类,直到找到NSObject,存在这个方法就展开调用 ,不存在就抛出方法未找到的异常错误

class 调用类方法的轨迹 先通过isa指针找到类对象的元类对象,查看是否存在这个方法,存在就直接展开调用;如果不存在,需要通过元类对象superclass指针找到父类的元类,查看父类的元类中是否存在这个方法,存在就直接展开调用;不存在就找父类的元类父类的元类,直到找到NSObjcet元类,存在这个方法就展开调用,不存在就去找NSObjcet类对象,存在这个方法就展开调用 ,不存在就抛出方法未找到的异常错误