1葛虐、objc_object屿脐、objc_class摄悯、class_rw_t愧捕、class_ro_t次绘、cache_t邮偎、bucket_t禾进、method_t泻云、protocol_t、ivar_t卸夕、property_t
- objc_class 結(jié)構(gòu)體繼承自objc_object
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
struct objc_class : objc_object {
// Class ISA;
Class superclass; // objc_class類(lèi)型的指針,指向父類(lèi)的objc_class結(jié)構(gòu)體
cache_t cache; // 方法緩存个初,可增量擴(kuò)展的哈希表
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
}
// 用散列表緩存調(diào)用過(guò)的方法猴蹂,提高方法查詢(xún)速度
struct cache_t {
struct bucket_t *_buckets; // 可變長(zhǎng)度的結(jié)構(gòu)體數(shù)組
mask_t _mask; // 散列表長(zhǎng)度 - 1
mask_t _occupied; // 已經(jīng)緩存的方法數(shù)量(散列表形式存在覆获,會(huì)空槽)
}
typedef uintptr_t cache_key_t;
using MethodCacheIMP = IMP;
struct bucket_t {
MethodCacheIMP _imp; // IMP
cache_key_t _key; // SEL
}
class_rw_t = class_data_bits_t & FAST_DATA_MASK;
struct class_rw_t {
const class_ro_t *ro; // 編譯時(shí)就確定好的
method_array_t methods; // 方法列表 二維數(shù)組
property_array_t properties; // 屬性列表 二維數(shù)組
protocol_array_t protocols; // 協(xié)議列表 二維數(shù)組
char *demangledName; // 類(lèi)名
}
struct class_ro_t {
uint32_t instanceSize; // 長(zhǎng)度
const char * name; // 類(lèi)名
method_list_t * baseMethodList; // 方法列表 一維數(shù)組
protocol_list_t * baseProtocols; // 協(xié)議 一維數(shù)組
const ivar_list_t * ivars; // 成員變量 一維數(shù)組
property_list_t *baseProperties; // 屬性 一維數(shù)組
};
struct method_t {
SEL name; // 方法名
const char *types; // 函數(shù)參數(shù) + 返回值類(lèi)型
MethodListIMP imp; // 方法地址
}
struct protocol_t : objc_object {
const char *mangledName; // 協(xié)議名
struct protocol_list_t *protocols; // 協(xié)議列表
method_list_t *instanceMethods; // 實(shí)例方法
method_list_t *classMethods; // 類(lèi)方法
method_list_t *optionalInstanceMethods; // 可選實(shí)例方法
method_list_t *optionalClassMethods; // 可選類(lèi)方法
property_list_t *instanceProperties; // 實(shí)例屬性
property_list_t *_classProperties; // 類(lèi)屬性
const char *demangledName();
}
struct ivar_t {
int32_t *offset; // 地址中的偏移
const char *name; // 變量名
const char *type; // 變量類(lèi)型
};
struct property_t {
const char *name; // 屬性名
const char *attributes; // 屬性?xún)?nèi)容:strong、weak...
};
- 編譯后class_data_bits_t 指向的是一個(gè)class_ro_t的地址(只讀)摹量,運(yùn)行時(shí)缨称,通過(guò)realizeClass()函數(shù)將bits指向class_rw_t
- 初始化類(lèi):realizeClass -> 設(shè)置rw祝迂、ro
// 初始化類(lèi)信息
static Class realizeClass(Class cls) {
const class_ro_t *ro;
class_rw_t *rw;
Class supercls;
Class metacls;
bool isMeta;
// 是否為空
if (!cls) return nil;
// 是否已經(jīng)初始化
if (cls->isRealized()) return cls;
assert(cls == remapClass(cls));
// 取出class中的data
ro = (const class_ro_t *)cls->data();
if (ro->flags & RO_FUTURE) {
// class初始化
rw = cls->data();
ro = cls->data()->ro;
cls->changeInfo(RW_REALIZED|RW_REALIZING, RW_FUTURE);
} else {
// 創(chuàng)建class_rw_t
rw = (class_rw_t *)calloc(sizeof(class_rw_t), 1);
// 給class_rw_t里面的class_ro_t賦值
rw->ro = ro;
// 設(shè)置狀態(tài)
rw->flags = RW_REALIZED|RW_REALIZING;
// 給cls->data重新賦值class_rw_t
cls->setData(rw);
}
isMeta = ro->flags & RO_META;
rw->version = isMeta ? 7 : 0; // old runtime went up to 6
supercls = realizeClass(remapClass(cls->superclass));
metacls = realizeClass(remapClass(cls->ISA()));
cls->superclass = supercls;
cls->initClassIsa(metacls);
cls->setInstanceSize(ro->instanceSize);
if (supercls) {
addSubclass(supercls, cls);
} else {
addRootClass(cls);
}
// 取出class_ro_t中的數(shù)據(jù)睦尽,賦值給class_rw_t
methodizeClass(cls);
return cls;
}
- 初始化類(lèi)后,class_rw_t中的methods型雳、protocols当凡、properties的都是空的,需要在methodizeClass函數(shù)中進(jìn)行賦值纠俭,將class_ro_t中的數(shù)據(jù)取出沿量,賦值給class_rw_t
// 給rw賦值method list、protocol list冤荆、property list
static void methodizeClass(Class cls) {
bool isMeta = cls->isMetaClass();
auto rw = cls->data();
auto ro = rw->ro;
// Install methods and properties that the class implements itself.
// 1朴则、把ro中的方法添加到rw中
method_list_t *list = ro->baseMethods();
if (list) {
prepareMethodLists(cls, &list, 1, YES, isBundleClass(cls));
rw->methods.attachLists(&list, 1);
}
// 2、把ro中的屬性添加到rw中
property_list_t *proplist = ro->baseProperties;
if (proplist) {
rw->properties.attachLists(&proplist, 1);
}
// 3钓简、把ro中的協(xié)議添加到rw中
protocol_list_t *protolist = ro->baseProtocols;
if (protolist) {
rw->protocols.attachLists(&protolist, 1);
}
if (cls->isRootMetaclass()) {
addMethod(cls, SEL_initialize, (IMP)&objc_noop_imp, "", NO);
}
// Attach categories.
// 把分類(lèi)中的方法乌妒、屬性欧宜、協(xié)議添加到類(lèi)中去
category_list *cats = unattachedCategoriesForClass(cls, true /*realizing*/);
attachCategories(cls, cats, false /*don't flush caches*/);
if (cats) free(cats);
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者