在iOS开发中,类使我们最常接触的一个名词,那么它到底是什么呢?它内部的结构如何。我们通过点击查看Class
可知
typedef struct objc_class *Class;
Class
其实是一个objc_class
的结构体。
那么objc_class
又是什么呢,我们来继续探索。
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t 和一些自定义的标识。
//。。。。其他的省略
}
通过源码查看得知,objc_class
是一个继承于objc_object
的结构体。
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
objc_class
通过继承objc_object
获得了其中唯一的isa成员变量。
class_rw_t
部分代码
struct class_rw_t {
// Be warned that Symbolication knows the layout of this structure.
//...省略
const class_ro_t *ro;
method_array_t methods; //实例方法
property_array_t properties; //属性
protocol_array_t protocols; //协议
//...省略
}
而class_rw_t
是通过bits
调用data
方法得来的,我们来到data方法内部实现。我们可以看到,data
函数内部仅仅对bits
进行&FAST_DATA_MASK
操作。
#define FAST_DATA_MASK 0x00007ffffffffff8UL
class_rw_t* data() {
return (class_rw_t *)(bits & FAST_DATA_MASK);
}
我们通过查看class_ro_t
的源码得知,成员变量信息是存储在这里的。
struct class_ro_t {
uint32_t flags;
uint32_t instanceStart;
uint32_t instanceSize;//实例对象大小
#ifdef __LP64__
uint32_t reserved;
#endif
const uint8_t * ivarLayout;
const char * name;
method_list_t * baseMethodList;
protocol_list_t * baseProtocols;
const ivar_list_t * ivars;//成员变量
const uint8_t * weakIvarLayout;
property_list_t *baseProperties;
method_list_t *baseMethods() const {
return baseMethodList;
}
};
得出如下图总结