Runtime知識梳理

補(bǔ)一下:runtime使用DEMO

以前對runtime的使用和了解都很模糊。這段時間呻疹,把runtime機(jī)制好好學(xué)習(xí)、整理了一下。

##什么是runtime

runtime是一套比較底層的純C語言API馆蠕,屬于1個C語言庫,包含了很多底層的C語言API惊奇。

##runtime對Objective-C影響

Objective-C之所以是一個動態(tài)語言互躬,可以動態(tài)得創(chuàng)建類和對象、進(jìn)行消息傳遞和轉(zhuǎn)發(fā)颂郎。正因為它擁有`Runtime`這個了不起的庫吼渡。

(ps:靜態(tài)語言:它的數(shù)據(jù)類型是在編譯期間檢查的,編寫時必須申明所有變量的數(shù)據(jù)類型)

##runtime核心—消息傳遞

Objective-C中對象調(diào)用某個方法乓序,它不像靜態(tài)語言寺酪,在編譯時就已經(jīng)決定在某塊內(nèi)存中執(zhí)行函數(shù)方法,而是在運行時給obj對象發(fā)送一條方法消息替劈,runtime會根據(jù)對象能否對這條消息作出響應(yīng)給出不同處理方式寄雀。

因為在編寫Objective-C函數(shù)調(diào)用時,都會被轉(zhuǎn)換成一個C的函數(shù)調(diào)用:`-objc_msgSend()`

```例:

[person work] => objc_msgSend(person, @selector(work))

```

###消息傳遞的執(zhí)行過程

`runtime.h`頭文件中抬纸,我們可以看出咙俩,OC中的類,對象以及方法其實都是一個C的結(jié)構(gòu)體。

objcStruct
methodStruct

`IMP:即函數(shù)指針阿趁,為方法具體實現(xiàn)代碼塊地址`

下面我們通過一個流程圖來看看`objc_mgSend`傳遞過程中做了什么膜蛔。

`[obj work]`為例:

search_IMP

####objc_cache作用

流程圖這種執(zhí)行方式效率較低。因為一個class方法列表中的方法脖阵,我們可能常常連一半也用不到皂股,而每個消息都需要遍歷一邊`objc_method_list`這樣消耗很大 。所以我們使用`objc_cache`,在找到 `method` 之后命黔,把 `method_imp` 對應(yīng) `method_name` 利用鍵值存儲起來呜呐。下次再接收到 `method` 消息時,可以直接在 `cache` 中查詢使用悍募。

##runtime之動態(tài)方法解析和消息轉(zhuǎn)發(fā)

####如果流程圖過程中蘑辑,我們最終還是沒有找到`work_imp`,那么我們的程序?qū)⒚媾R崩潰坠宴,這時`runtime` 還給我們提供了動態(tài)添加方法的補(bǔ)救措施洋魂。

-Runtime提供了三種方式來將原來的方法實現(xiàn)代替掉。

####1.`Method Resolution`: 當(dāng) `Runtime` 系統(tǒng)在Cache和方法分發(fā)表中(包括超類)找不到要執(zhí)行的方法時喜鼓,`Runtime`會調(diào)用 `resolveInstanceMethod:`或`resolveClassMethod:`來給程序員一次動態(tài)添加方法實現(xiàn)的機(jī)會副砍。我們需要用`class_addMethod`函數(shù)完成向特定類添加特定方法實現(xiàn)的操作

由于`Method Resolution`不能像消息轉(zhuǎn)發(fā)那樣可以交給其他對象來處理,所以只適用于在原來的類中代替掉庄岖。

```

+ (BOOL)resolveInstanceMethod:(SEL)aSEL

{

if (aSEL == @selector(method)) {

?class_addMethod([self class], @selector(method), (IMP)method, "v@:");

?return YES;

}

?return [super resolveInstanceMethod:aSEL];

}```

####2. `Fast Forwarding`: 它可以將消息處理轉(zhuǎn)發(fā)給其他對象豁翎,使用范圍更廣,不只是限于原來的對象隅忿。

```

- (id)forwardingTargetForSelector:(SEL)aSEL

{

if(aSelector == @selector(method:)){

return alternateObject;

}

return [super forwardingTargetForSelector:aSEL];

}```

如果此方法返回nil或self,則會進(jìn)入消息轉(zhuǎn)發(fā)機(jī)制(forwardInvocation:);否則將向返回的對象重新發(fā)送消息心剥。

####3. `Normal Forwarding`: 它跟Fast Forwarding一樣可以消息轉(zhuǎn)發(fā),但它能通過NSInvocation對象獲取更多消息發(fā)送的信息硼控,例如:target刘陶、selector、arguments和返回值等信息牢撼。

```

- (void)forwardInvocation:(NSInvocation *)anInvocation {

SEL selector = [anInvocation selector];

newClass *Obj = [newClass new];

if ([mobile respondsToSelector:selector]) {

[anInvocation invokeWithTarget:Obj];

}

}```

DynamicMethodResolution

##runtime的一些使用?

-獲取類的屬性列表

-獲取類的方法列表

-獲取類的協(xié)議列表

-獲取類的成員變量列表

-動態(tài)添加成員變量

-動態(tài)添加屬性

-自動歸檔/解檔

詳細(xì)使用DEMO演示:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匙隔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子熏版,更是在濱河造成了極大的恐慌纷责,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撼短,死亡現(xiàn)場離奇詭異再膳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)曲横,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門喂柒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來不瓶,“玉大人,你說我怎么就攤上這事灾杰∥秘ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵艳吠,是天一觀的道長麦备。 經(jīng)常有香客問我,道長昭娩,這世上最難降的妖魔是什么凛篙? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮栏渺,結(jié)果婚禮上呛梆,老公的妹妹穿的比我還像新娘。我一直安慰自己磕诊,他們只是感情好削彬,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秀仲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壶笼。 梳的紋絲不亂的頭發(fā)上神僵,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音覆劈,去河邊找鬼保礼。 笑死,一個胖子當(dāng)著我的面吹牛责语,可吹牛的內(nèi)容都是我干的炮障。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼坤候,長吁一口氣:“原來是場噩夢啊……” “哼胁赢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起白筹,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤智末,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后徒河,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系馆,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年顽照,在試婚紗的時候發(fā)現(xiàn)自己被綠了由蘑。 大學(xué)時的朋友給我發(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
  • 我被黑心中介騙來泰國打工筷厘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留鸣峭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓酥艳,卻偏偏與公主長得像摊溶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子充石,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 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
  • 繼上Runtime梳理(四) 通過前面的學(xué)習(xí),我們了解到Objective-C的動態(tài)特性:Objective-C不...
    小名一峰閱讀 752評論 0 3
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,554評論 33 466
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 731評論 0 2
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,135評論 0 9