? ? 今天繼續(xù)寫runtime相關(guān)的知識。
? ? 我一直認為,要搞定一門知識,一定要把他的最基本最基礎(chǔ)的東西全部搞明白才行;上一篇寫了類的結(jié)構(gòu)、對象的結(jié)構(gòu)以及runtime如何讓c具有了面向?qū)ο蟮哪芰?,今天繼續(xù)看一些基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的東西。
? ? 我們再把objc_class的結(jié)構(gòu)體里面的一些元素拎出來看一看:
(一、)methodLists
? ? ?struct objc_method_list **methodLists OBJC2_UNAVAILABLE;// 方法定義的鏈表
? ? 細心的同學(xué)應(yīng)該注意到,這是一個二級指針,一個指向指針的指針,即指針變量當(dāng)中存的是一個地址,你可以改變這個地址的值從而改變最終指向的變量。放一張圖也許更清晰一點。

? methodLists表示方法列表,一個指向結(jié)構(gòu)體objc_method_list的二級指針,可以動態(tài)的修改
*methodLists的值來添加方法,這也是實現(xiàn)category的原理。
? 具體看一下objc_method_list
structobjc_method_list {
structobjc_method_list *obsolete ? ? ? ? ? ? ? ? ? ?OBJC2_UNAVAILABLE;
int method_count ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;
#ifdef __LP64__
int space ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OBJC2_UNAVAILABLE;
#endif
/* variable length structure */
struct objc_method method_list[1] ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;
}
? ? ?objc_method_list是一個鏈表,存儲多個objc_method,而objc_method結(jié)構(gòu)體存儲類的某個方法的信息。
(二、)cache
struct objc_cache *cache ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OBJC2_UNAVAILABLE;
structobjc_cache {
? ? ? ? ?unsigned int mask/* total = mask + 1 */ ? ? ? ? ? ? ? ?OBJC2_UNAVAILABLE;
? ? ? ? ?unsigned int occupied ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;
? ? ? ? ?Method buckets[1] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;
};
? ? cache用來緩存經(jīng)常訪問的方法,當(dāng)調(diào)用方法時,優(yōu)先在cache中查找,如果沒有找到,再到methodLists查找。
? ? 大家可能有疑問,為什么搞一個這個東西出來,為什么不直接在類的methodLists直接搜索呢?原因是那樣效率太低了,一個類經(jīng)常被調(diào)用的方法大概只有20%,會占到總調(diào)用次數(shù)的80%。所以緩存就很有必要了,cache用來緩存經(jīng)常訪問的方法,會很高提升查找到方法的效率。
? ? 基本上到現(xiàn)在objc_class大家應(yīng)該已經(jīng)有了了解,后面要繼續(xù)介紹的是類與對象的操作函數(shù),以及runtime消息轉(zhuǎn)發(fā)的機制。會寫一些小??來幫助大家理解。
若果您在閱讀過程中有任何問題,請隨時給我留言。