iOS Runtime

Runtime 簡(jiǎn)介:

Runtime 又叫運(yùn)行時(shí)衫生,是一套底層的 C 語(yǔ)言 API凹炸,其為 iOS 內(nèi)部的核心之一,我們平時(shí)編寫的 OC 代碼懒熙,底層都是基于它來(lái)實(shí)現(xiàn)的丘损。

與Runtime交互

Objc 從三種不同的層級(jí)上與 Runtime 系統(tǒng)進(jìn)行交互,分別是通過(guò) Objective-C 源代碼工扎,通過(guò) Foundation 框架的NSObject類定義的方法徘钥,通過(guò)對(duì) runtime 函數(shù)的直接調(diào)用。

Runtime 是什么:

1.運(yùn)行時(shí)(Runtime)是指將數(shù)據(jù)類型的確定由編譯時(shí)推遲到了運(yùn)行時(shí)肢娘。

2.Runtime是一套比較底層的純C語(yǔ)言API, 屬于1個(gè)C語(yǔ)言庫(kù), 包含了很多底層的C語(yǔ)言API呈础。

3.平時(shí)編寫的OC代碼舆驶,在程序運(yùn)行過(guò)程中,其實(shí)最終會(huì)轉(zhuǎn)換成Runtime的C語(yǔ)言代碼而钞,Runtime是Object-C的幕后工作者沙廉。

4.Object-C需要Runtime來(lái)創(chuàng)建類和對(duì)象,進(jìn)行消息發(fā)送和轉(zhuǎn)發(fā)臼节。

特性:?編寫的代碼具有運(yùn)行時(shí)撬陵、動(dòng)態(tài)特性。

Runtime用來(lái)干什么官疲?用在哪些地方袱结?

用來(lái)干什么 基本作用

1.在程序運(yùn)行過(guò)程中,動(dòng)態(tài)的創(chuàng)建類途凫,動(dòng)態(tài)添加垢夹、修改這個(gè)類的屬性和方法;

2.遍歷一個(gè)類中所有的成員變量维费、屬性果元、以及所有方法;

3.消息傳遞犀盟、轉(zhuǎn)發(fā)而晒;

4.方法調(diào)配;

5.“類對(duì)象” NSProxy阅畴;

6.KVC倡怎、KVO ;

用在哪些地方 Runtime的典型事例

1.給系統(tǒng)分類添加屬性贱枣、方法监署;

2.方法交換;

3.獲取對(duì)象的屬性纽哥、私有屬性钠乏;

4.字典轉(zhuǎn)換模型;

5.KVC春塌、KVO;

6.歸檔(編碼晓避、解碼);

7.NSClassFromString class<->字符串

8.block;

9.類的自我檢測(cè);

10.Aspects(AOP必備,“取締” baseVC只壳,無(wú)侵入埋點(diǎn))

消息轉(zhuǎn)發(fā)機(jī)制

當(dāng)向某個(gè)對(duì)象發(fā)送一條消息時(shí)俏拱,若該對(duì)象的方法列表以及它相應(yīng)繼承鏈上的方法列表都無(wú)法找到以該消息選擇子作為key的方法實(shí)現(xiàn)時(shí),則會(huì)觸發(fā)消息轉(zhuǎn)發(fā)機(jī)制吼句。

1.動(dòng)態(tài)方法解析?+ (BOOL)resolveInstanceMethod:(SEL)sel;

當(dāng)接受到未能識(shí)別的選擇子時(shí)彰触,運(yùn)行時(shí)系統(tǒng)會(huì)調(diào)用該函數(shù)用以給對(duì)象一次機(jī)會(huì)來(lái)添加相應(yīng)的方法實(shí)現(xiàn),如果用戶在該函數(shù)中動(dòng)態(tài)添加了相應(yīng)方法的實(shí)現(xiàn)命辖,則跳轉(zhuǎn)到方法的實(shí)現(xiàn)部分况毅,并將該實(shí)現(xiàn)存入緩存中分蓖,以供下次調(diào)用。

2.備用接收者??- (id)forwardingTargetForSelector:(SEL)aSelector;

如果運(yùn)行時(shí)在消息轉(zhuǎn)發(fā)的動(dòng)態(tài)方法解析中未找到所調(diào)用方法的實(shí)現(xiàn)尔许,那么當(dāng)前接收者還有第二次機(jī)會(huì)進(jìn)行未知選擇子的處理么鹤。這時(shí)運(yùn)行期系統(tǒng)會(huì)調(diào)用上述方法,并將未知選擇子作為參數(shù)傳入味廊,該方法可以返回一個(gè)能處理該選擇子的對(duì)象蒸甜,運(yùn)行時(shí)系統(tǒng)會(huì)根據(jù)返回的對(duì)象進(jìn)行查找,若找到則跳轉(zhuǎn)到相應(yīng)方法的實(shí)現(xiàn)余佛,則消息轉(zhuǎn)發(fā)結(jié)束柠新。

3.完整的消息轉(zhuǎn)發(fā)??- (void)forwardInvocation:(NSInvocation *)anInvocation;

當(dāng)運(yùn)行時(shí)系統(tǒng)檢測(cè)到備援接收者中用戶未返回能處理相應(yīng)選擇子的對(duì)象時(shí),那么來(lái)到這一步就要啟動(dòng)完整的消息轉(zhuǎn)發(fā)機(jī)制了辉巡。該方法可以改變消息調(diào)用目標(biāo)恨憎,運(yùn)行時(shí)系統(tǒng)根據(jù)所改變的調(diào)用目標(biāo),向調(diào)用目標(biāo)方法列表中查詢對(duì)應(yīng)方法的實(shí)現(xiàn)并實(shí)現(xiàn)跳轉(zhuǎn)郊楣,這種方式和備用接收者步的操作非常相似憔恳。當(dāng)然你也可以修改方法的選擇子,亦或者向所調(diào)用方法中追加一個(gè)參數(shù)等來(lái)跳轉(zhuǎn)到相關(guān)方法的實(shí)現(xiàn)净蚤。

最后钥组,如果消息轉(zhuǎn)發(fā)的第3步還未能處理該未知選擇子的話,那么最終會(huì)調(diào)用NSObject類的如下方法用以異常的拋出今瀑,表明該選擇子最終未能處理程梦。

- (void)doesNotRecognizeSelector:(SEL)aSelector;

附上完整的消息轉(zhuǎn)發(fā)流程圖:


歡迎大家指出文中的錯(cuò)誤!

也歡迎大家指出文中的不足橘荠!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末作烟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砾医,更是在濱河造成了極大的恐慌,老刑警劉巖衣厘,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件如蚜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡影暴,警方通過(guò)查閱死者的電腦和手機(jī)错邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)型宙,“玉大人撬呢,你說(shuō)我怎么就攤上這事∽倍遥” “怎么了魂拦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵毛仪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我芯勘,道長(zhǎng)箱靴,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任荷愕,我火速辦了婚禮衡怀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘安疗。我一直安慰自己抛杨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布荐类。 她就那樣靜靜地躺著怖现,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掉冶。 梳的紋絲不亂的頭發(fā)上真竖,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音厌小,去河邊找鬼恢共。 笑死,一個(gè)胖子當(dāng)著我的面吹牛璧亚,可吹牛的內(nèi)容都是我干的讨韭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼癣蟋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼透硝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疯搅,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤濒生,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后幔欧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體罪治,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年礁蔗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了觉义。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浴井,死狀恐怖晒骇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤洪囤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布徒坡,位于F島的核電站,受9級(jí)特大地震影響箍鼓,放射性物質(zhì)發(fā)生泄漏崭参。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一款咖、第九天 我趴在偏房一處隱蔽的房頂上張望何暮。 院中可真熱鬧,春花似錦铐殃、人聲如沸海洼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坏逢。三九已至,卻和暖如春赘被,著一層夾襖步出監(jiān)牢的瞬間是整,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工民假, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浮入,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓羊异,卻偏偏與公主長(zhǎng)得像事秀,于是被迫代替她去往敵國(guó)和親浓恶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恳守,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 758評(píng)論 0 1
  • 簡(jiǎn)介(http://www.cnblogs.com/ioshe/p/5489086.html) Runtime 又...
    清風(fēng)沐沐閱讀 507評(píng)論 0 0
  • Runtime 又叫運(yùn)行時(shí),是一套底層的 C 語(yǔ)言 API肉康,其為 iOS 內(nèi)部的核心之一平道,我們平時(shí)編寫的 OC 代...
    獨(dú)荹儛臨閱讀 286評(píng)論 0 0
  • ??關(guān)于Runtime的用法和詳解睹欲,一直想研究了解一下,但是一直沒(méi)有時(shí)間進(jìn)行徹底的學(xué)習(xí)(說(shuō)白了就是懶一屋,也就是現(xiàn)在人...
    Hello小小酥閱讀 1,970評(píng)論 5 41
  • runtime 和 runloop 作為一個(gè)程序員進(jìn)階是必須的窘疮,也是非常重要的, 在面試過(guò)程中是經(jīng)常會(huì)被問(wèn)到的陆淀, ...
    SOI閱讀 21,802評(píng)論 3 63