和對象(objc_object
結構體)一樣篇亭,類(objc_class
結構體)在新的運行時中也有了很大的改變,在 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();
}
// 省略掉一些結構體方法
};
可以注意到孽江,換上 C++ 之后辜腺,objc_class
結構體直接從 objc_object
結構體繼承下來了,并且注釋了 isa
的存在碉渡。 比較之前的定義聚谁,第二個成員依舊是指向父類的指針,但是之后就完全不一樣了滞诺,可以看到 cache
的類型變成了 cache_t
形导,其余的信息都塞進了 bits
里。
bits
的右邊可以看到好心的開發(fā)者留給后人的注釋习霹,解釋了這個成員也是類似于 isa
一樣朵耕,將位(bit)用作不同用途。其中最重要的就是 class_rw_t *
了淋叶,可以看到 data()
函數(shù)就是用來返回這個結構體指針的阎曹,class_rw_t
的名字表示它是類的可讀可寫數(shù)據(jù)。
繼續(xù)在 objc-runtime-new.h
中看到 class_rw_t
結構體的定義
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;
Class firstSubclass;
Class nextSiblingClass;
char *demangledName;
}
可以注意到它有一個 ro
成員煞檩,是類的只讀數(shù)據(jù)处嫌,這是類在編譯時就確定了的東西,它的定義如下
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;
}
};
在實現(xiàn)中形娇,class_rw_t
結構體的 methods
锰霜、properties
和 protocols
會包含它的 ro
中對應的數(shù)據(jù)和 category 的數(shù)據(jù),這是類在加載到運行時時做的事情桐早,之后的文章會有詳細的說明癣缅。這樣,在消息發(fā)送中查找方法時哄酝,是不需要在 ro
中搜索的友存。
總結
大致了解了一下類在 Objective-C 運行時中的實現(xiàn),具體的細節(jié)部分也還需要分析不同功能時具體分析了陶衅。