Runtime詳解

最近在研究Runtime漓糙,因此铣缠,打算寫一篇文章跟小伙伴兒們分享一下。好了兼蜈,廢話不多說攘残,直接上干貨拙友。

RunTime簡稱運行時为狸。OC就是運行時機制,也就是在運行時候的一些機制遗契,其中最主要的是消息機制辐棒。簡單說一下C與OC在編譯和運行階段的區(qū)別,對于C語言牍蜂,函數的調用在編譯的時候會決定調用哪個函數漾根。對于OC的函數,屬于動態(tài)調用過程鲫竞,在編譯的時候并不能決定真正調用哪個函數辐怕,只有在真正運行的時候才會根據函數的名稱找到對應的函數來調用。

Runtime有5大作用:發(fā)送消息从绘,交換方法寄疏,動態(tài)添加方法,給分類添加屬性僵井,字典轉模型陕截,下面一一給大家講解一下這5個作用。


一批什、發(fā)送消息

任何方法調用的本質就是發(fā)送一個消息农曲,用runtime發(fā)送消息,OC底層就是通過runtime實現的驻债。下面給大家展示一下底層的代碼:

正常的OC代碼通過Xcode的編譯器Clang重新編譯乳规,就會生成底層的代碼,也就是消息機制的代碼合呐。話說回來暮的,怎么使用編譯器重新編譯呢?我們在終端輸入clang -rewrite-objc main.m 就可以得到最終生成代碼了合砂。

我們使用Runtime時青扔,必須要提前導入頭文件<objc/message.h>源织,可能有人會問我,為什么不導入<objc/runtime.h>?因為我們進入message.h的聲明中微猖,會發(fā)現已經導入了runtime.h谈息。

上面展示的代碼是最底層的代碼,寫著太麻煩了凛剥,很少用侠仇,下面給大家展示一下我們平常寫的代碼:

這個就是我們平常寫的,第一個參數的意思是:誰發(fā)送消息?????? 第二個參數的意思是:發(fā)送什么消息犁珠。

其實逻炊,還有一種寫法,也是可以的:

上面僅僅給大家展示了一些消息機制底層代碼的一下寫法犁享,下面說一下Runtime在消息機制中最重要的一個作用:“runtime消息機制,可以調用私有方法”S嗨亍!4独ァ=暗酢!凤巨!

下面給大家展示一下视乐,調用私有方法:


上面的eat,run方法在Person類中均沒有聲明敢茁,只有實現佑淀。

注:我們在用對象p調用方法時,不要用Person *p = objc_msgSend(object_getClass(@"Person"), sel_registerName("alloc"))這種形式彰檬,否則伸刃,會崩。

上面是對象方法僧叉,下面給大家展示一下類方法奕枝。

對象方法的對象調用,類方法的本質是類對象調用瓶堕。


下面隘道,給大家分享一下方法的調用流程:

1.去尋找對應的類對象,每一個對象都有一個isa指針郎笆,通過isa指針去對應類中查找谭梗;

2.注冊方法編號

3.根據方法編號查找對應的方法

4.找到只是最終函數實現地址,根據地址去方法區(qū)調用對應函數。



二宛蚓、交換方法

交換方法是Runtime中最常用的激捏,我們在做項目時經常用到。

Runtime(交換方法):只要想修改系統(tǒng)的方法實現凄吏。

比如:有一個項目,已經開發(fā)了2年,忽然項目負責人添加一個功能,每次UIImage加載圖片,告訴我是否加載成功远舅?

這樣的一個需求闰蛔,除了使用Runtime交換方法,用其他的方法很難實現图柏。

交換方法的步驟為:(1)給系統(tǒng)的方法添加分類;

??????????????????????????????? (2)自己實現一個帶有擴展功能的方法;

??????????????????????????????? (3)交換方法的實現序六,只需要交換一次。

下面直接上代碼:

分類的聲明:

分類的實現:



三蚤吹、動態(tài)添加方法

動態(tài)添加方法:OC是懶加載機制,只要一個方法實現了,就會馬上添加到方法列表中(不管這個方法有沒有用過例诀,都會添加進去)。如果某個類中方法比較多裁着,而且有很多方法不常用繁涂,需要給每個方法都生成映射表,加載類到內存的時候就比較耗費資源二驰,可以使用動態(tài)給該類添加方法解決扔罪。

下面直接上代碼:

Person類的實現部分:

動態(tài)添加方法在做項目時用得比較少。


4诸蚕、動態(tài)添加屬性

我們給系統(tǒng)的類添加屬性的時候步势,可以使用runtime動態(tài)添加屬性。動態(tài)添加屬性的本質:讓某個屬性和某個對象產生一個關聯背犯,并不是直接把這個值的內存空間添加到類內存空間。

代碼如下:

給系統(tǒng)的類添加一個分類盅抚,聲明部分:


實現部分:




4漠魏、字典轉模型

字典轉模型有兩種方法:1.KVC? 2.Runtime。第三方框架MJExtension底層就是用Runtime字典轉模型的妄均。

KVC的實現原理是:遍歷字典中所有的key柱锹,去模型中查找對應的屬性賦值;Runtime實現原理剛好與KVC相反:通過runtime丰包,把一個模型中所有屬性遍歷出來禁熏,根據屬性去字典里面找。

我們可以創(chuàng)建一個NSObject分類邑彪,專門字典轉模型瞧毙,以后所有模型都可以通過這個分類轉

代碼如下:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寄症,隨后出現的幾起案子宙彪,更是在濱河造成了極大的恐慌,老刑警劉巖有巧,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件释漆,死亡現場離奇詭異,居然都是意外死亡篮迎,警方通過查閱死者的電腦和手機男图,發(fā)現死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門示姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逊笆,你說我怎么就攤上這事峻凫。” “怎么了览露?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵荧琼,是天一觀的道長。 經常有香客問我差牛,道長命锄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任偏化,我火速辦了婚禮脐恩,結果婚禮上,老公的妹妹穿的比我還像新娘侦讨。我一直安慰自己驶冒,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布韵卤。 她就那樣靜靜地躺著骗污,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沈条。 梳的紋絲不亂的頭發(fā)上需忿,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音蜡歹,去河邊找鬼屋厘。 笑死,一個胖子當著我的面吹牛月而,可吹牛的內容都是我干的汗洒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼父款,長吁一口氣:“原來是場噩夢啊……” “哼溢谤!你這毒婦竟也來了?” 一聲冷哼從身側響起铛漓,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤溯香,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浓恶,有當地人在樹林里發(fā)現了一具尸體玫坛,經...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年包晰,在試婚紗的時候發(fā)現自己被綠了湿镀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕吸。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勉痴,靈堂內的尸體忽然破棺而出赫模,到底是詐尸還是另有隱情,我是刑警寧澤蒸矛,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布瀑罗,位于F島的核電站,受9級特大地震影響雏掠,放射性物質發(fā)生泄漏斩祭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一乡话、第九天 我趴在偏房一處隱蔽的房頂上張望摧玫。 院中可真熱鬧,春花似錦绑青、人聲如沸诬像。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坏挠。三九已至,卻和暖如春掠拳,著一層夾襖步出監(jiān)牢的瞬間癞揉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工溺欧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柏肪。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓姐刁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親烦味。 傳聞我的和親對象是個殘疾皇子聂使,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容

  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,132評論 0 9
  • 運行時是iOS中一個很重要的概念,iOS運行過程中都會被轉化為runtime的C代碼執(zhí)行谬俄。例如[target do...
    蘿卜醬紫閱讀 393評論 0 3
  • 公司項目用到一個三方開源庫柏靶,里面有個bug,不能改動源碼溃论,我想來想去屎蜓,只能通過runtime這個萬能的手段來解決。...
    夜千尋墨閱讀 17,938評論 41 205
  • 對于從事 iOS 開發(fā)人員來說钥勋,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,700評論 7 64
  • 車牌號的組成一般為:省份 + 地區(qū)代碼 + 5位數字/字母炬转。車牌號碼查詢
    謝小帥閱讀 5,843評論 0 0