iOS runtime詳細內(nèi)容

runtime的主要數(shù)據(jù)結構.png

一. objc_object結構體 objc_class結構體

1.1 objc_object結構體
image.png
image1.png
  • isa指針分為 指針型isa非指針型isa
image.png
1.2 objc_class結構體
結構體主要內(nèi)容:
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();
    }
    ......
}
image.png
1.3 cache_t結構體
struct cache_t {
    struct bucket_t *_buckets;//可以理解為一個數(shù)組
    mask_t _mask;
    mask_t _occupied;
    ......
}
方法緩存的數(shù)據(jù)結構.png
通過哈希查找.png
image.png

cache_t的特點:
1.用于快速查找方法執(zhí)行函數(shù)
2.是可增量擴展哈希表結構(增量拓展:結構的量增大,內(nèi)存也會增大)
3.是局部性原理的最佳應用(局部性原理:調(diào)用次數(shù)較高的方法)

1.4 class_data_bits_t結構體

class_data_bits_t包含class_rw_t,class_rw_t內(nèi)包含

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;
    ......
}
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;
    }
};
image.png
  • 一個類定義的變量 方法 屬性都在class_data_bits_t這個成員結構內(nèi)
image.png

protocols(協(xié)議) properties(屬性) methods(方法) 是一個二維數(shù)組,還包括一些分類等

image.png

name 類名
ivars 聲明,定義的成員變量
properties 屬性
protocols 協(xié)議
methods 方法
他們是一個一維數(shù)組

image.png
image.png

二.類對象 元類對象

類對象 存儲實例方法列表等信息
元類對象 存儲類方法列表等信息

image.png

問題1:類對象和元類對象之間有什么區(qū)別和聯(lián)系?

實例對象通過isa指針找到類對象
類對象當中存儲方法列表等信息
類對象通過isa指針找到元類對象、從而可以訪問類方法列表等相關信息
類對象和元類對象都是objc_class數(shù)據(jù)結構,因為繼承objc_object。所以他們才有isa指針,進而可以實現(xiàn)實例對象通過isa指針找到類對象,進而可以訪問實例方法列表等信息。類對象通過isa指針找到元類對象、從而可以訪問類方法列表的相關信息。

問題2:如果我們調(diào)用的類方法,沒有對應的實現(xiàn)。但是有同名的實例方法,會不會發(fā)生崩潰,會不會產(chǎn)生實際的調(diào)用?

由于根元類對象的superclass指針,指向了根類對象,當我們在元類對象當中查找類方法列表查不到的時候。會順著指針去實例方法列表查找。如果有同名方法,就會調(diào)用同名方法的實例方法調(diào)用。

問題3:實例方法的傳遞過程?

系統(tǒng)根據(jù)當前的isa指針。找到它的類對象,在它的類對象當中查找方法列表。沒有查找到的話,就會根據(jù)superclass查找父類的類對象的方法列表。然后根類對象的方法列表,如果還沒有,就進入消息轉發(fā)流程。

問題4:類方法的傳遞過程?

通過類對象的isa指針,找到元類對象。在它的元類對象當中查找方法列表。沒有查找到的話,就會根據(jù)superclass查找父類的元類對象的方法列表。然后順次遍歷方法列表,直到根元類對象,再到根類對象。然后根類對象的方法列表,如果還沒有,就進入消息轉發(fā)流程。

問題4:類對象 元類對象isa指向問題。

元類對象的isa指針 指向 根元類對象
根元類對象isa指針 指向 根元類對象
根元類對象的superclass指針指向根類對象

問題5:打印結果

image.png

結果都是Phone。因為接收者都是當前對象。


image.png

問題6:消息傳遞的機制?
首先通過 哈希查找 查找緩存,緩存沒命中,查當前類的方法列表是否命中(對于已排序好的列表,采用二分查找,對于沒有排序的列表,采用一般遍歷查找方法)。如果仍然沒命中,逐級父類方法列表是否命中(父類查找是先通過superclass指針查找父類,遍歷每一個父類,對于每一個父類,又通過緩存查找和當前類方法列表查找)。如果都沒有命中,進入消息轉發(fā)流程。

image.png

問題7:[obj foo]和objc_msgSend()函數(shù)之間有什么關系?
編譯之后,會在內(nèi)部變成objc_msgSend()函數(shù)調(diào)用。

問題8:消息轉發(fā)流程3個步驟
1.resolvelnstanceMethod(告訴系統(tǒng)是否要解決當前的方法實現(xiàn))
2.forwardingTargetForSelector:(告訴系統(tǒng)這個實例方法的調(diào)用應該由哪個對象來處理,轉發(fā)對象是誰)
3.methodSignatureForSelector:(1.返回方法簽名,調(diào)用forwardInvocation,如果可以處理,轉發(fā)結束 2.如果返回為nil,或者forwardInvocation無法處理,無法找到方法崩潰)

image.png

問題9:runtime如何通過Selector找到對應的IMP地址的?
首先查找當前實例對應類對象的緩存是否有Selector對應的IMP實現(xiàn),如果緩存命中,就把命中的緩存函數(shù)返回給調(diào)用方。如果緩存沒有命中。根據(jù)當前類的方法列表查找Selector對應的IMP事件。當前類如果沒有命中,再根據(jù)當前類的superClass指針逐級查找父類的方法列表。然后查找Selector對應的IMP事件。

問題10:@dynamic (動態(tài)方法解析)
相當于在運行時添加set get方法。而不是在編譯時聲明好

動態(tài)運行時語言將函數(shù)決議推遲到運行時
編譯時語言在編譯期進行函數(shù)決議

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372