RunTime-動態(tài)運(yùn)行時

RunTime簡介:

RunTime簡稱運(yùn)行時戏锹。OC就是運(yùn)行時機(jī)制斜棚,也就是運(yùn)行時候的一些機(jī)制,其中最主要的就是消息機(jī)制啄育。
對于C語言酌心,函數(shù)的調(diào)用在編譯的時候就會決定調(diào)用哪個函數(shù),如果調(diào)用未實(shí)現(xiàn)的函數(shù)就會報錯灸撰。對于OC語言谒府,他是一門動態(tài)的語言拼坎,因?yàn)樗诰幾g的時候并不能決定真正調(diào)用的是哪個函數(shù),只有在真正運(yùn)行的時候才會根據(jù)函數(shù)的名稱找到對應(yīng)的函數(shù)進(jìn)行調(diào)用完疫。在編譯階段泰鸡,OC可以調(diào)用任何函數(shù),即使這個函數(shù)并未實(shí)現(xiàn)壳鹤,只要聲明過就不會報錯盛龄。

RunTime消息機(jī)制

消息機(jī)制是運(yùn)行時里面最重要的機(jī)制,OC中任何方法的調(diào)用芳誓,本質(zhì)都是發(fā)送消息余舶。

@selector(SEL):

這是一個方法選擇器。主要作用是快速的通過方法名字查找到對應(yīng)方法的函數(shù)指針锹淌,然后調(diào)用其函數(shù)也就是IMP匿值。SEL其本身是一個Int類型的地址,地址中存放著方法名字赂摆。對于一個類中挟憔,每一個方法對應(yīng)著一個SEL。所以一個類中不能存在兩個名稱相同的方法烟号,即使參數(shù)類型不同也不行绊谭,因?yàn)镾EL是根據(jù)方法名字生成的,相同的方法名稱只能對應(yīng)一個SEl汪拥。

實(shí)例方法和類方法的調(diào)用過程

屏幕快照 2019-10-14 上午10.07.40.png

實(shí)例方法的調(diào)用過程:首先會根據(jù)實(shí)例對象的isa指針找到他的類對象达传,在類對象的對象方法列表中去查找是否有對應(yīng)實(shí)現(xiàn),如果有就調(diào)用迫筑,沒有就依次去類對象的父類中查找宪赶,一直找到NSObject還沒有的話會進(jìn)入消息轉(zhuǎn)發(fā),如果在消息轉(zhuǎn)發(fā)流程(其中有三個方法)還是沒有做處理铣焊,就會報找不到方法異常逊朽。

[圖片上傳中...(屏幕快照 2019-10-14 上午10.04.48.png-68eabe-1571018691218-0)]

類方法的調(diào)用過程:首先也是會根據(jù)類對象的isa指針找到它的元類,元類中存儲著類方法列表曲伊,如果當(dāng)前元類的類方法列表沒有叽讳,再依次去元類的父類中查找對應(yīng)實(shí)現(xiàn),一直找到根元類坟募,還是沒有的話岛蚤,這個時候與實(shí)例方法調(diào)用不同的是,如果類對象里面有同名的實(shí)例方法懈糯,就回去調(diào)用同名的實(shí)例方法涤妒。如果沒有在進(jìn)入消息轉(zhuǎn)發(fā),消息轉(zhuǎn)發(fā)沒做處理的話就會報找不到方法異常赚哗。

屏幕快照 2019-10-14 上午10.05.27.png

Runtime的應(yīng)用:

獲取列表

    Method *methods = class_copyMethodList([UITextView class], &count);
    for (int i = 0; i < count; i++) {
        Method method = methods[i];
        SEL selector = method_getName(method);
        NSString *name = NSStringFromSelector(selector);
        NSLog(@"method_getName:%@",name);
    }
    
    unsigned int numIvars;
    Ivar *vars = class_copyIvarList([UITextView class], &numIvars);
    NSString *key=nil;
    for(int i = 0; i < numIvars; i++) {
        
        Ivar thisIvar = vars[i];
        key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
        NSLog(@"variable_name :%@", key);
    }

1.獲取列表(比如獲取類的屬性列表她紫,方法列表硅堆,成員變量列表)。比如實(shí)際開發(fā)中做歸檔解檔的時候?qū)ο蟮膶傩院芏嗟臅r候就可以用RunTime這個特性很方便的簡化代碼贿讹。
2.方法調(diào)用:正如上面所講的實(shí)例方法調(diào)用和類方法調(diào)用渐逃。
3.攔截調(diào)用:攔截調(diào)用就是,在找不到調(diào)用的方法程序奔潰之前民褂,你有機(jī)會通過重寫NSObject的四個方法來處理茄菊。
4.動態(tài)添加方法:如果一個類方法非常多,其中可能許多方法暫時用不到赊堪。而加載類方法到內(nèi)存的時候需要給每個方法生成映射表面殖,比較耗費(fèi)資源,這個時候就可以用Runtime動態(tài)添加方法哭廉。動態(tài)給某個類添加方法脊僚,相當(dāng)于懶加載機(jī)制,類中許多方法暫時用不到群叶,那么就先不加載吃挑,等用的時候再去加載钝荡。另外如果找不到對應(yīng)的方法時就會來到攔截調(diào)用街立,也就是因?yàn)檎也坏椒椒▽?shí)現(xiàn),在奔潰之前可以調(diào)用的方法埠通。當(dāng)調(diào)用了沒有實(shí)現(xiàn)的對象方法時赎离,就會調(diào)用+(BOOL)resolveInstanceMethod:(SEL)sel方法當(dāng)調(diào)用了沒有實(shí)現(xiàn)的類方法時,就會調(diào)用+(BOOL)resolveClassMethod:(SEL)sel方法端辱,我們就可以實(shí)現(xiàn)這兩個方法動態(tài)的給實(shí)例方法或者類方法添加方法和方法實(shí)現(xiàn)梁剔。
5.方法交換:當(dāng)系統(tǒng)自帶的方法功能不夠,需要給系統(tǒng)自帶的方法擴(kuò)展一些功能舞蔽,并且保持原有的功能時荣病,可以使用Runtime交換方法實(shí)現(xiàn)。這個特性可以用來處理開發(fā)中常見的奔潰(比如字典添加nil值渗柿,和數(shù)組越界等導(dǎo)致的奔潰)或者是統(tǒng)一添加埋點(diǎn)个盆,可以很方便的解決這些問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朵栖,一起剝皮案震驚了整個濱河市颊亮,隨后出現(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ī)與錄音谅畅,去河邊找鬼。 笑死噪服,一個胖子當(dāng)著我的面吹牛毡泻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粘优,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼仇味,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敬飒?” 一聲冷哼從身側(cè)響起邪铲,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎无拗,沒想到半個月后带到,有當(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
  • 正文 我和宋清朗相戀三年揽惹,在試婚紗的時候發(fā)現(xiàn)自己被綠了被饿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡搪搏,死狀恐怖狭握,靈堂內(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. 我叫王不留惰蜜,地道東北人昂拂。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像抛猖,于是被迫代替她去往敵國和親格侯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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