iOS中isa的深层理解

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

中我们可以看到:

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是个什么东西呢?
中我们看到:

(这里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.由于每个类有且只有一个,所以每个类对象都是其对应元类的单例
那么,元类是对象吗?
答案是肯定的,元类是对象。
如果元类也是对象,元类的类又是什么?
下图解释:
iOS中isa的深层理解_第1张图片
WechatIMG56.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的深层理解)