美文网首页学习OC 底层
iOS中isa的深层理解

iOS中isa的深层理解

作者: 面朝对象_春暖花开 | 来源:发表于2017-02-16 17:02 被阅读947次

    我之前的isa理解不透彻,现在重新梳理我对iOS底层object的理解.(只代表个人理解).

    在<objc.h>中我们可以看到:

    typedef struct objc_class *Class;
    struct objc_object {
        Class isa  OBJC_ISA_AVAILABILITY;
    };
    
    /// A pointer to an instance of a class.
    typedef struct objc_object *id;
    

    解释这段代码: objc_object中有一个Class类型的属性isa,而Class是一个指向objc_class的指针,存放着一个objc_class的地址. id是一个指向objc_object的指针.那objc_class是个什么东西呢?
    在<objc/runtime.h>中我们看到:

    (这里struct类型是c++对c的扩展,除了访问权限是public之外其他的和class一模一样)
    struct objc_class {
        Class isa  OBJC_ISA_AVAILABILITY;
    
    #if !__OBJC2__
        Class super_class                                        OBJC2_UNAVAILABLE;
        const char *name                                         OBJC2_UNAVAILABLE;
        long version                                             OBJC2_UNAVAILABLE;
        long info                                                OBJC2_UNAVAILABLE;
        long instance_size                                       OBJC2_UNAVAILABLE;
        struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
        struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
        struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
        struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
    #endif
    
    } OBJC2_UNAVAILABLE;
    

    解释这段代码: objc_class中也有一个isa指针,这个指针不是指向自己而是mateclass(元类),简单介绍一下元类的概念

    元类是类对象的类,类对象是元类的实例。基于这种设计模式,不难发现:
    1.我们以前调用 "+" 开头的类方法实际是在调用元类的对象方法
    2.由于每个类有且只有一个,所以每个类对象都是其对应元类的单例
    那么,元类是对象吗?
    答案是肯定的,元类是对象。
    如果元类也是对象,元类的类又是什么?
    下图解释:
    
    329694-69a689f166a7c256.png
    //    model * zyn = [[model alloc]init];
        Class metaClass_parent = objc_getMetaClass("model_parent");
        Class metaClass_child = objc_getMetaClass("model_child.h");
        Class superClass_metaClass_parent = class_getSuperclass(metaClass_parent);
        Class superClass_metaClass_child = class_getSuperclass(metaClass_child);
        Class metaClass_NSObject = objc_getMetaClass("NSObject");
        Class superClass_metaClass_NSObject = class_getSuperclass(metaClass_NSObject);
    

    结果:下图


    屏幕快照 2017-02-16 下午4.55.52.png
    其实到这就明白了:
    1 , objc_object中的isa 指的是对象的类;
    2 , objc_class中的isa只的是类的元类;
    3 , superClass是一层层集成的,到最后NSObject的superClass是nil.而NSObject的isa指向根元类,这个跟元类的isa指向它自己,而它的superClass是NSObject,也就是最后形成一个环,这个环让我想起了先有鸡还是先有蛋的问题.
    4 , mateClass也是相互继承的.
    5 , 这个逻辑就想着objc_class的struct,里面有个isa属性,还有个super_class属性,他俩都是指针,其实在objc_class的定义中也能看出来,每一个objc_class都有isa,但是不一定会有super_class,近三天每天想一次.
    

    相关文章

      网友评论

        本文标题:iOS中isa的深层理解

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