Runtime 理解

Runtime


Runtime 就是去解決如何在運行時期找到調(diào)用方法。

(OC 是一門動態(tài)語言臊诊,函數(shù)調(diào)用變成了消息發(fā)送,在編譯期不能知道要調(diào)用哪個函數(shù))

對于實例變量有如下的思路:

instance -> class -> method -> SEL -> IMP -> 實現(xiàn)函數(shù)
  • 實例對象 中存放 isa 指針 以及 實例變量

  • isa 指針 可以找到 實例對象 所屬的類對象 (類也是對象蠢笋,面向?qū)ο笾幸磺卸际菍ο?。

  • 中存放著 實例方法列表鳞陨,在這個 方法列表SEL 作為 key昨寞,IMP 作為 value瞻惋。(在編譯時期,根據(jù)方法名字會生成一個唯一的 Int 標識援岩,這個標識就是 SEL歼狼。IMP 其實就是函數(shù)指針 指向了最終的函數(shù)實現(xiàn)。)
  • 整個 Runtime 的核心就是 objc_msgSend 函數(shù)享怀,通過給類發(fā)送 SEL 以傳遞消息羽峰,找到匹配的 IMP 再獲取最終的實現(xiàn)
  • 類中的 super_class 指針 可以追溯 整個繼承鏈添瓷。
  • metaClass是元類梅屉,也有 isa 指針、super_class 指針鳞贷。其中保存了 類方法列表坯汤。

重點:

描述了對象的內(nèi)存布局
  • 向一個對象發(fā)送消息時,Runtime 會根據(jù) 實例對象isa 指針 找到 其所屬的類搀愧,并自底向上直至根類(NSObject)中 去尋找 SEL 所對應的方法惰聂,找到后就運行整個方法。

SEL 與 IMP


SEL 可以將其理解為方法的 ID妈橄。
IMP 可以理解為函數(shù)指針庶近,指向了最終的實現(xiàn)。

  • others

OC 中不支持函數(shù)重載原因:就是因為一個類的方法列表中不能存在兩個相同的 SEL 眷蚓。

但是多個方法卻可以在不同的類中有一個相同的 SEL鼻种,不同類的實例對象執(zhí)行相同的 SEL 時,會在各自的方法列表中去根據(jù) SEL 去尋找自己對應的IMP沙热,這使得OC可以支持函數(shù)重寫叉钥。

消息傳遞機制

  • objc_msgSend函數(shù)的消息處理過程
  • 不涵蓋消息cache機制
  • 需要對Objective-C runtime有一定的了解

如下用于描述 objc_msgSend 函數(shù)的調(diào)用流程

1.檢測 SEL 是否應該被忽略;
2.檢測發(fā)送的 target 是否為 nil 篙贸,如果是則忽略該消息投队;

  • 當調(diào)用實例方法時,通過 isa 指針找到實例對應的 class 并且在其中的緩存方法列表以及方法列表中進行查詢爵川,如果找不到則根據(jù) super_class 指針在父類中查詢敷鸦,直至根類(NSObject 或 NSProxy).
  • 當調(diào)用類方法時,通過 isa 指針找到實例對應的 metaclass 并且在其中的緩存方法列表以及方法列表中進行查詢寝贡,如果找不到則根據(jù) super_class 指針在父類中查詢扒披,直至根類(NSObject 或 NSProxy). (根據(jù)此前的開篇中的圖,Root Meta Class 還是有根類的圃泡。)
  1. 如果還沒找到則進入消息動態(tài)解析過程碟案。

動態(tài)消息解析過程

動態(tài)消息解析

如下用于描述動態(tài)消息解析的流程:

  1. 通過 resolveInstanceMethod 得知方法是否為動態(tài)添加,YES則通過 class_addMethod 動態(tài)添加方法颇蜡,處理消息价说,否則進入下一步辆亏。(dynamic 屬性就與這個過程有關(guān),當一個屬性聲明為 dynamic 時 就是告訴編譯器:開發(fā)者一定會添加 setter/getter 的實現(xiàn)鳖目,而編譯時不用自動生成扮叨。)

  2. 這步會進入 forwardingTargetForSelector 用于指定哪個對象來響應消息。如果返回nil 則進入第三步领迈。(這種方式把消息原封不動地轉(zhuǎn)發(fā)給目標對象甫匹,有著比較高的效率。如果不能自己的類里面找到替代方法惦费,可以重載這個方法,然后把消息轉(zhuǎn)給其他的對象抢韭。)

  3. 這步調(diào)用 methodSignatureForSelector 進行方法簽名薪贫,這可以將函數(shù)的參數(shù)類型和返回值封裝。(如果返回 nil 說明消息無法處理并報錯 unrecognized selector sent to instance刻恭,如果返回 methodSignature瞧省,則進入 forwardInvocation )在forwardInvocation這里可以修改實現(xiàn)方法,修改響應對象等(如果方法調(diào)用成功鳍贾,則結(jié)束鞍匾。如果依然不能正確響應消息,則報錯 unrecognized selector sent to instance.)

(可以利用 2骑科、3 中的步驟實現(xiàn)對接受消息對象的轉(zhuǎn)移橡淑,可以實現(xiàn)“多重繼承”的效果。)


參考:Objective-C Runtime

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咆爽,一起剝皮案震驚了整個濱河市梁棠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斗埂,老刑警劉巖符糊,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呛凶,居然都是意外死亡男娄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門漾稀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來模闲,“玉大人,你說我怎么就攤上這事县好∥穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵缕贡,是天一觀的道長翁授。 經(jīng)常有香客問我拣播,道長,這世上最難降的妖魔是什么收擦? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任贮配,我火速辦了婚禮,結(jié)果婚禮上塞赂,老公的妹妹穿的比我還像新娘泪勒。我一直安慰自己,他們只是感情好宴猾,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布圆存。 她就那樣靜靜地躺著,像睡著了一般仇哆。 火紅的嫁衣襯著肌膚如雪沦辙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天讹剔,我揣著相機與錄音油讯,去河邊找鬼。 笑死延欠,一個胖子當著我的面吹牛陌兑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播由捎,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼兔综,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隅俘?” 一聲冷哼從身側(cè)響起邻奠,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎为居,沒想到半個月后碌宴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蒙畴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年贰镣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳凝。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡碑隆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬音,到底是詐尸還是另有隱情上煤,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布著淆,位于F島的核電站劫狠,受9級特大地震影響拴疤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜独泞,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一呐矾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懦砂,春花似錦蜒犯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羽资,卻和暖如春毫炉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背削罩。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留费奸,地道東北人弥激。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像愿阐,于是被迫代替她去往敵國和親微服。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉缨历,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,709評論 0 9
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,554評論 33 466
  • ping怎么這么高以蕴? 什么是Runtime? 這還要說辛孵?run( 運行)丛肮、time(時),runtime(運行時)...
    大大盆子閱讀 648評論 1 1
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言魄缚,那么這個「動態(tài)」表現(xiàn)在哪呢宝与?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,192評論 0 7
  • 主要參考鏈接: http://yulingtianxia.com/blog/2014/11/05/objectiv...
    Kevin_Junbaozi閱讀 3,311評論 0 10