对象的isa指针指向哪里?

2024-03-10  本文已影响0人  buding_

对象的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才得到真正的地址

上一篇 下一篇

猜你喜欢

热点阅读