对象的isa指针指向哪里?
*instance的isa指向class;
当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用。
*class的isa指向meta-class;
当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用。
OC类对象的信息存放在哪里?
实例对象(instance) 中存放: isa、成员变量的具体值
类对象(class) 中存放:isa、superclass、属性、协议、对象方法
元类对象(meta-class) 中存放:isa、superclass、类方法
探究一下superclass指针:
例子:
Student继承: Person Person继承: NSObject
Student-Class 的superclass指向 Person-Class
Person-Class 的superclass指向 NSObject-Class
NSObject-Class 的superclass指向 nil
Student-MetaClass 的superclass指向 Person-MetaClass
Person-MetaClass 的superclass指向 NSObject-MetaClass
NSObject-MetaClass 的superclass指向 NSObject-Class
Student *stu = [Student new];
[stu personInstanceAction]; -> 通过stu的isa指针找到Student-Class,通过Student-Class的superclass找到PersonClass,从而找到personAction方法
[Student personClassAction]; -> 通过StudentClass的isa找到Student-MetaClass,通过Student-MetaClass的superclass找到Person-MetaClass,从而找到personClassAction方法
isa与superclass的总结图
nill! Root Class(class)!
^ ^
|(superclass) |(superclass)
| |
Instance of Root Class --(isa)--> Root Class(class) --(isa)--> Root Class(meta) --(isa)--> Root Class(meta)!
^ ^
|(superclass) |(superclass)
| |
Instance of SuperClass --(isa)--> SuperClass(class) --(isa)--> SuperClass(meta) --(isa)--> Root Class(meta)!
^ ^
|(superclass) |(superclass)
| |
Instance of SubClass --(isa)--> SubClass(class) --(isa)--> SubClass(meta) --(isa)--> Root Class(meta)!
*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
*class调用方法的轨迹:isa找到meta-class,方法不存在,就通过superclass找父类的meta-class
从64bit开始, isa 需要 &ISA_MASK才得到真正的地址
网友评论