runtime 學(xué)習(xí)筆記(二)

? ? 今天繼續(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ā)的機制。會寫一些小??來幫助大家理解。


若果您在閱讀過程中有任何問題,請隨時給我留言。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 runtime其實在我們?nèi)粘i_發(fā)過程中很少使用到,尤其是像我現(xiàn)在比較初級的程序猿就更用不到了。但是去面試很多...
    WolfTin閱讀 840評論 0 2
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,041評論 0 9
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 828評論 0 2
  • runtime 和 runloop 作為一個程序員進階是必須的,也是非常重要的, 在面試過程中是經(jīng)常會被問到的, ...
    made_China閱讀 1,269評論 0 7
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 877評論 0 1

友情鏈接更多精彩內(nèi)容