类(class)和元类(meta-class)底层都是 objc_class
结构体的指针,内存中就是结构体。
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class _Nullable super_class OBJC2_UNAVAILABLE;
const char * _Nonnull name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;
struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;
struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
之前没有注意到 OBJC2_UNAVAILABLE
(眼瞎啊!!!),最近才注意到,这部分结构体已经弃用了,那新的是什么样?有变化吗?变化大吗?抱着这些问题,一起往下看。
源码下载地址
注意:因源码结构体太长,以下是部分截取
objc-runtime-new.h文件中
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 * plus custom rr/alloc flags
class_rw_t *data() {
return bits.data();
}
void setData(class_rw_t *newData) {
bits.setData(newData);
}
发现这里是一个继承关系,objc_class
继承自 objc_object
,先放放,后面会提到。
这里的 superclass
和 cache
,很容易看明白,可是 class_rw_t
是什么?
struct class_rw_t {
// Be warned that Symbolication knows the layout of this structure.
uint32_t flags;
uint32_t version;
const class_ro_t *ro;
method_array_t methods; // 方法列表
property_array_t properties; // 属性列表
protocol_array_t protocols; // 协议列表
此结构体存放着我们熟悉的 方法列表
、属性列表
、协议列表
等。
那 const class_ro_t *ro;
这个又是什么鬼?
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;
}
};
此结构体存放着 实例对象大小
、类名
、成员变量
等。
objc-private.h文件中
struct objc_object {
private:
isa_t isa;
public:
// ISA() assumes this is NOT a tagged pointer object
Class ISA();
// getIsa() allows this to be a tagged pointer object
Class getIsa();
isa
指针出现了,看到这就明白了,因为 objc_class
继承自 objc_object
,所以 objc_class
也拥有 isa
指针。
网友评论