iOS開發(fā)之Objective-C Runtime

1.Runtime 是什么?

Runtime是用來動態(tài)創(chuàng)建類和對象,進(jìn)行消息發(fā)送和轉(zhuǎn)發(fā)的一套機(jī)制撞鹉。

2.Runtime 的運(yùn)行原理逆日?

要提運(yùn)行原理,先要解釋一下類的結(jié)構(gòu)奠滑。

每個(gè)類都包含:isa指針丹皱,指向了MetaClass。super_class 父類宋税、ivars(成員變量)摊崭、cache(緩存)、協(xié)議列表和method_list(方法列表)等杰赛。

消息:

OC代碼 [receiver message] ? 編譯后成 ?[objc_msgSend(receiver,selector)]?

// 除了編譯成objc_msgSend 外還有 objc_msgSendSuper 用super調(diào)用方法直接去父類找 以及objc_msgSend_stret 和 objc_msgSendSuper_stret?

當(dāng)一條OC代碼轉(zhuǎn)化成消息呢簸,首先找到接受者receiver,在它的cache中找selector,如果沒找到再到method_list中找乏屯,如果沒找到會沿著isa指針往metaClass中找根时,如果在Class中沒找到的話就會去superClass中找一直找到。如果找到的話辰晕,會把方法存到Cache中蛤迎,下次運(yùn)行的時(shí)候就不用一層層往上找了。如果在rootClass中都沒找到的話含友。在消息報(bào)錯(cuò)之前會還有機(jī)會處理這條消息替裆。

在消息報(bào)錯(cuò)之前校辩,如果你重寫了

+(Bool)resolveInstanceMethod:(SEL)sel 或者 +(Bool)resolveClassMethod:(SEL)sel ?

// 動態(tài)提供添加方法 ?一般會在里面調(diào)用class_addMethod 添加方法來處理消息。

那么可以在這個(gè)方法里面處理消息辆童,如果沒有處理則會給對象發(fā)送一條fowardInvocation消息

你可以在-(void)forwardInvocation:(NSInvocation *)anInvocation 中把消息給轉(zhuǎn)發(fā)給能處理的對象宜咒。 ?

NSInvocation 對象包含了原來的消息和傳遞的參數(shù)。

3.Runtime 能做什么把鉴?

遍歷類故黑,找私有成員變量、私有方法纸镊,給Category添加成員變量倍阐、對library進(jìn)行一些操作等。具體的方法參:官方文檔

有關(guān) Method Swizzling逗威。

Method Swizzling 簡單來說就是修改了Method(包含SEL,IMP的結(jié)構(gòu)體) 的 IMP(一個(gè)指執(zhí)行方法的函數(shù)指針)峰搪。在消息傳達(dá)時(shí),根據(jù)receiver找到對應(yīng)的Selector后,它會根據(jù)Selector對應(yīng)的IMP然后去找到方法凯旭。而Method Swizzling 其實(shí)就是修改了Seletor對應(yīng)的IMP概耻。

你可以通過重寫或者替換掉某些方法的IMP來實(shí)現(xiàn)特定的功能。

比如:

void method_exchangeImplementations (Method m1, Method m2) ?

// 交換兩個(gè)Method 的IMP

更多的方法可以查看官方文檔

有關(guān)Method Swizzling更詳細(xì)的文章:http://nshipster.com/method-swizzling/

參考文檔:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008048-CH1-SW1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罐呼,一起剝皮案震驚了整個(gè)濱河市鞠柄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫉柴,老刑警劉巖厌杜,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異计螺,居然都是意外死亡夯尽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門登馒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匙握,“玉大人,你說我怎么就攤上這事陈轿∪Ψ模” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵麦射,是天一觀的道長蛾娶。 經(jīng)常有香客問我,道長潜秋,這世上最難降的妖魔是什么蛔琅? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮半等,結(jié)果婚禮上揍愁,老公的妹妹穿的比我還像新娘。我一直安慰自己杀饵,他們只是感情好莽囤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著切距,像睡著了一般朽缎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谜悟,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天话肖,我揣著相機(jī)與錄音,去河邊找鬼葡幸。 笑死最筒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔚叨。 我是一名探鬼主播床蜘,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔑水!你這毒婦竟也來了邢锯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤搀别,失蹤者是張志新(化名)和其女友劉穎丹擎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歇父,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒂培,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庶骄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毁渗。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖单刁,靈堂內(nèi)的尸體忽然破棺而出灸异,到底是詐尸還是另有隱情,我是刑警寧澤羔飞,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布肺樟,位于F島的核電站,受9級特大地震影響逻淌,放射性物質(zhì)發(fā)生泄漏么伯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一卡儒、第九天 我趴在偏房一處隱蔽的房頂上張望田柔。 院中可真熱鬧俐巴,春花似錦、人聲如沸硬爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缀磕。三九已至缘圈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袜蚕,已是汗流浹背糟把。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牲剃,地道東北人遣疯。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像凿傅,于是被迫代替她去往敵國和親另锋。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉狭归,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,686評論 0 9
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 729評論 0 2
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言夭坪,那么這個(gè)「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,182評論 0 7
  • 本文詳細(xì)整理了 Cocoa 的 Runtime 系統(tǒng)的知識过椎,它使得 Objective-C 如虎添翼室梅,具備了靈活的...
    lylaut閱讀 795評論 0 4
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 749評論 0 1