我之前的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.由于每个类有且只有一个,所以每个类对象都是其对应元类的单例
那么,元类是对象吗?
答案是肯定的,元类是对象。
如果元类也是对象,元类的类又是什么?
下图解释:
// 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);
结果:下图
其实到这就明白了:
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,近三天每天想一次.