Runtime簡介和字典轉(zhuǎn)模型框架的簡單分析

一、runtime簡介

  • runtime簡稱運行時.OC就是運行時機制,也就是在運行時候的一些機制,其中最主要的是消息機制.
  • 對于C語言,函數(shù)的調(diào)用在編譯的時候會決定調(diào)用那個函數(shù).
  • 對于0C的函數(shù),屬于動態(tài)調(diào)用過程,在編譯的時候并不能決定真正調(diào)用哪個函數(shù),之后在真正運行的時候才會根據(jù)函數(shù)的名稱找到對應(yīng)的函數(shù)來調(diào)用.
    • 在編譯階段,OC可以調(diào)用任何函數(shù),即使這個函數(shù)并未實現(xiàn),只要聲明過就不會報錯.
    • 在編譯階段,C語言調(diào)用未實現(xiàn)的函數(shù)就會報錯.

二、runtime作用

1.發(fā)送消息

  • 方法調(diào)用的本質(zhì),就是讓對象發(fā)送消息.
    *objc_msgSend,只有對象那個才能發(fā)送消息,因此以objc開頭.runtime:方法都是有前綴,誰的事情誰開頭
  • 使用消息機制的前提,必須導入#import<objc/message.h>(已包含runtime.h)
  • 進入代碼文件目錄,使用終端命令 clang -rewrite-objc main.m 查看最終生成代碼
    注意在xcode 7.0以后需要將嚴格檢查objc_msgSend Calls改為NO
//一般來說我們創(chuàng)建一個對象例如狗
    Dog *dog = [[Dog alloc] init];
//這個類中有兩個對象方法
- (void)eat;
- (void)run:(CGFloat)meters;
//一個對象方法
+ (void)sleep;

//調(diào)用對象的方法
[dog eat];
[dog run:100.0];

//本質(zhì)是讓對象發(fā)送消息
    objc_msgSend(dog, @selector(eat));
    objc_msgSend(dog, @selector(run:),100.0);

 // 調(diào)用類方法的方式:兩種
    // 第一種通過類名調(diào)用
    [Dog sleep];
    // 第二種通過類對象調(diào)用
    [[Dog class] sleep];

    // 用類名調(diào)用類方法挚歧,底層會自動把類名轉(zhuǎn)換成類對象調(diào)用
    // 本質(zhì):讓類對象發(fā)送消息
    objc_msgSend([Dog class], @selector(sleep));

消息機制原理:對象根據(jù)方法編號SEL去映射表查找對應(yīng)的方法實現(xiàn)

2.png

2.交換方法

  • 開發(fā)使用場景:系統(tǒng)自帶的方法功能不夠印机,給系統(tǒng)自帶的方法擴展一些功能距境,并且保持原有的功能羊苟。
  • 方式一:繼承系統(tǒng)的類寂曹,重寫方法.
  • 方式二:使用runtime,交換方法.
    example:需要給系統(tǒng)的imageNamed方法提供一個功能腹备,每次加載圖片的時候判斷下圖片是否加載成功.
   // 步驟一:先創(chuàng)建一個UIImage的分類衬潦,定義一個能加載圖片并且能打印的方法+ (instancetype)gzd_imageNamed:(NSString *)name;
    // 步驟二:交換imageNamed和gzd_imageNamed的實現(xiàn),就能在外界調(diào)用imageNamed的時候植酥,間接調(diào)用gzd_imageNamed的實現(xiàn)镀岛。
//外界只需要調(diào)用 
UIImage *image1 = [UIImage imageNamed:@"1"];

/**********UIImage分類的實現(xiàn)中***********/

@implementation UIImage (Extension)

//當加載分類到內(nèi)存的時候調(diào)用
+ (void)load {
     // 獲取gzd_imageNamed方法地址
    Method m1 = class_getClassMethod(self, @selector(gzd_imageNamed:));
 // 獲取imageNamed方法地址
    Method m2 = class_getClassMethod(self, @selector(imageNamed:));    
// 交換方法地址,相當于交換實現(xiàn)方式
    method_exchangeImplementations(m1, m2);
}

+ (instancetype)gzd_imageNamed:(NSString *)name {
    
//這里調(diào)用gzd_imageNamed 相當于調(diào)用了imageNamed;
    UIImage *image = [UIImage gzd_imageNamed:name];
    
    if (image == nil) {
        NSLog(@"圖片加載失敗");
        return nil;
    }else {
        NSLog(@"加載成功");
        return image;
    }
}
@end

3.動態(tài)添加方法

  • 如果一個類方法非常多友驮,加載類到內(nèi)存的時候也比較耗費資源漂羊,需要給每個方法生成映射表,可以使用動態(tài)給某個類卸留,添加方法解決走越。
  • performSelector
    創(chuàng)建person類

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耻瑟,隨后出現(xiàn)的幾起案子旨指,更是在濱河造成了極大的恐慌,老刑警劉巖喳整,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆构,死亡現(xiàn)場離奇詭異,居然都是意外死亡框都,警方通過查閱死者的電腦和手機搬素,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熬尺,你說我怎么就攤上這事摸屠。” “怎么了猪杭?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵餐塘,是天一觀的道長。 經(jīng)常有香客問我皂吮,道長戒傻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任蜂筹,我火速辦了婚禮需纳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘艺挪。我一直安慰自己不翩,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布麻裳。 她就那樣靜靜地躺著口蝠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪津坑。 梳的紋絲不亂的頭發(fā)上妙蔗,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音疆瑰,去河邊找鬼眉反。 笑死,一個胖子當著我的面吹牛穆役,可吹牛的內(nèi)容都是我干的寸五。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼耿币,長吁一口氣:“原來是場噩夢啊……” “哼梳杏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掰读,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤秘狞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蹈集,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烁试,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年拢肆,在試婚紗的時候發(fā)現(xiàn)自己被綠了减响。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靖诗。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖支示,靈堂內(nèi)的尸體忽然破棺而出刊橘,到底是詐尸還是另有隱情,我是刑警寧澤颂鸿,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布促绵,位于F島的核電站,受9級特大地震影響嘴纺,放射性物質(zhì)發(fā)生泄漏败晴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一栽渴、第九天 我趴在偏房一處隱蔽的房頂上張望尖坤。 院中可真熱鬧,春花似錦闲擦、人聲如沸慢味。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纯路。三九已至,卻和暖如春寞忿,著一層夾襖步出監(jiān)牢的瞬間感昼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工罐脊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜕琴。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓萍桌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凌简。 傳聞我的和親對象是個殘疾皇子上炎,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,726評論 0 9
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,569評論 33 466
  • 前言 runtime其實在我們?nèi)粘i_發(fā)過程中很少使用到雏搂,尤其是像我現(xiàn)在比較初級的程序猿就更用不到了藕施。但是去面試很多...
    WolfTin閱讀 633評論 0 2
  • 想要去除這個“返回”的文字,可以這樣: 但是這樣做在iOS9以上會有問題凸郑,后臺返回會跳屏 找到了另外的方法裳食,這樣:
    陸非凡閱讀 1,122評論 1 2
  • 一,項目介紹: 歐德尚韓式冰瓷牙芙沥,引進韓國3D納米術(shù)诲祸,不創(chuàng)傷浊吏,不動原牙,無傷害救氯,無后遺癥找田,兩三小時內(nèi)機器?手工貼片...
    梵般若閱讀 475評論 0 0