美文网首页
对象的isa指针指向哪里?

对象的isa指针指向哪里?

作者: buding_ | 来源:发表于2024-03-10 19:12 被阅读0次

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

    相关文章

      网友评论

          本文标题:对象的isa指针指向哪里?

          本文链接:https://www.haomeiwen.com/subject/nirpzdtx.html