iOS底层 Class的结构 - AlvinSunny/OC-TheUnderlying GitHub Wiki
class结构中最重要的属性就是isa指针
在arm64架构之前,存储了ISA指针指向对象的内存地址,但是在arm64之后需要在存储地址值&ISA_MASK 这个值才是指向对象的内存地址。示意图如下

##objc4源码地址

窥探struct object_class的结构
简化(去掉方法定义,保留属性)后的源码
objc-private.h
struct objc_object {
private:
isa_t isa;
};
objc-runtime-new.h
这个结构体中包含的是类的原始信息,是不允许修改的
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;
}
这个结构体中包含的是程序员手动给类添加的信息,是可读可写的
struct class_rw_t {
// Be warned that Symbolication knows the layout of this structure.
uint32_t flags;
uint16_t version;
uint16_t witness;
const class_ro_t *ro;
method_array_t methods;
property_array_t properties;
protocol_array_t protocols;
Class firstSubclass;
Class nextSiblingClass;
char *demangledName;
}
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 * plus custom rr/alloc flags
/**
class_rw_t* data() const {
return (class_rw_t *)(bits & FAST_DATA_MASK);
}
*/
class_rw_t *data() const {
return bits.data();
}
};
图解
