struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; /// 方法緩存
class_data_bits_t bits; /// 類信息
class_rw_t *data() {
return (class_rw_t *)(bits & FAST_DATA_MASK);
}
}
摘出重要的部分,objc_class 是繼承 objc_object 結(jié)構(gòu)體
struct objc_object {
private:
isa_t isa;
}
objc_object
有 isa 指針铭若,所以 class 也有 isa 指針,這就是為什么可以通過我們的類對(duì)象找到元類的原因递览,如果沒有isa指針是不行的叼屠。
superclas
指針,只用來指向當(dāng)前類的父類的
bit我在接下來講绞铃,主要是加快查找效率的镜雨,
bits
:可以看出 class_rw_t
=class_data_bits_t bits & FAST_DATA_MASK
struct class_rw_t {
uint32_t flags;
uint32_t version;
const class_ro_t *ro; /// 只讀類信息
method_array_t methods; /// 方法列表
property_array_t properties; /// 屬性列表
protocol_array_t protocols; /// 協(xié)議列表
Class firstSubclass;
Class nextSiblingClass;
char *demangledName;
}
struct class_ro_t {
uint32_t flags;
uint32_t instanceStart;
uint32_t instanceSize; /// istance對(duì)象 占用的內(nèi)存空間
#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; /// weak 成員變量?jī)?nèi)存布局
property_list_t *baseProperties;
}
class_ro_t里面的baseMethodList、baseProtocols儿捧、ivars荚坞、baseProperties是一維數(shù)組挑宠,是只讀的,包含了類的初始內(nèi)容
class_ro_t 是 readonly 的颓影,在編譯階段就已經(jīng)確定了各淀,不可以修改。
在編譯的時(shí)候诡挂,將累的屬性碎浇,方法,協(xié)議和成員變量璃俗,添加到我們的 class_ro_t 中奴璃,然后運(yùn)行的時(shí)候,會(huì)動(dòng)態(tài)的創(chuàng)建 class_rw_t 然后將 class_ro_t 和分類中的屬性城豁,協(xié)議方法存儲(chǔ)到 class_rw_t 中苟穆,并進(jìn)行排序,分類中的存儲(chǔ)在數(shù)組的前部唱星,原始類信息雳旅,存儲(chǔ)在數(shù)組的后面,class_ro_t 是只能的魏颓,在運(yùn)行時(shí)是不可以添加進(jìn)去的