runtime機(jī)制

runtime是什么

runtime官脓,即運(yùn)行時(shí)機(jī)制。
runtime是一套底層的純C的API前标,是一個(gè)C語言庫坠韩。
平時(shí)寫的OC代碼,最終都會(huì)轉(zhuǎn)成runtime的C語言代碼炼列,runtime的幕后工作者只搁。

比如:
在OC中:

[[Person alloc] init];

在runtime中:

objc_msgSend(objc_msgSend("Person","alloc"),"init");

runtime的應(yīng)用

  • 攔截系統(tǒng)的方法調(diào)用
  • 把OC代碼轉(zhuǎn)換為運(yùn)行時(shí)代碼,探究底層俭尖,比如block的內(nèi)部實(shí)現(xiàn)
  • 字典轉(zhuǎn)模型
  • 在程序運(yùn)行的狀態(tài)中氢惋,動(dòng)態(tài)創(chuàng)建一個(gè)類 (比如KVO底層的實(shí)現(xiàn))
  • 在程序運(yùn)行的狀態(tài)中,動(dòng)態(tài)地為某個(gè)類添加屬性/方法稽犁,修改屬性值/方法(分類增加屬性焰望。
    有人說分類不能增加屬性,這是不準(zhǔn)確的已亥,分類可以增加屬性柿估,并且會(huì)自動(dòng)生成聲明,但不會(huì)自動(dòng)生成get/set方法陷猫,這時(shí)就需要借助runtime來實(shí)現(xiàn))
#import <Foundation/Foundation.h>

@interface NSObject (Ex)

@property (nonatomic, copy) NSString *name;

@end
#import "NSObject+Ex.h"
#import <objc/runtime.h>

char namekey;

@implementation NSObject (Ex)

//關(guān)聯(lián)對(duì)象函數(shù)
// id object被關(guān)聯(lián)的對(duì)象
// const void *key關(guān)聯(lián)鍵
// id value 關(guān)聯(lián)值
// objc_AssociationPolicy policy 關(guān)聯(lián)策略
- (void)setName:(NSString *)name{
    objc_setAssociatedObject(self, &namekey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name{
    return objc_getAssociatedObject(self, &namekey);
}

@end
  • 遍歷一個(gè)類的成員變量(屬性)

相關(guān)方法和頭文件

  • 頭文件
    <objc/runtime.h>
    <objc/message.h>

  • 方法

  • NSCoding(歸檔和解檔)

  • 字典轉(zhuǎn)模型(利用runtime遍歷模型對(duì)象的所有屬性秫舌,根據(jù)屬性名從字典里取出相應(yīng)的值的妖,設(shè)置到模型的屬性上)

  • KVO(利用runtime動(dòng)態(tài)產(chǎn)生一個(gè)類)

  • objc_msgsend給對(duì)象發(fā)送消息

  • class_copymethodList遍歷某個(gè)類的方法

  • class_copyIvarList遍歷某個(gè)類的成員變量

  • class_...

  • class_getClassMethod 獲取類方法

  • method_exchangeImplementations 方法交換

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImageView *view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    view.image = [UIImage imageNamed:@"pic_1"];
    [self.view addSubview:view];
    
}

@end
#import "UIImage+ExTension.h"
#import <objc/runtime.h>

@implementation UIImage (ExTension)
//+ (void)load 只在加載時(shí)調(diào)用一次
+ (void)load{
    NSLog(@"image load");
    
//get類方法
    Method m1 = class_getClassMethod([UIImage class], @selector(imageNamed:));
    Method m2 = class_getClassMethod([UIImage class], @selector(my_imageNamed:));
    //方法交換
    method_exchangeImplementations(m1, m2);
}

//自定義方法
+ (UIImage *)my_imageNamed:(NSString *)name{
    //方法已經(jīng)被置換,所以此時(shí)調(diào)用的my_imageNamed:實(shí)際上調(diào)用的是原方法imageNamed:
    return [UIImage my_imageNamed:@"pic_2"];
}

@end

程序執(zhí)行結(jié)果顯示的就是pic_2,而不是pic_1足陨。方法交換可以用于攔截在運(yùn)行時(shí)攔截一些方法嫂粟,在執(zhí)行完自己想要的操作后再跳回該方法。

  • +(void)load 是一個(gè)類方法 它在加載進(jìn)內(nèi)存時(shí)會(huì)調(diào)用一次
  • +(void)initialize 會(huì)在第一次調(diào)用類的類方法或?qū)嵗椒ㄖ氨徽{(diào)用一次墨缘。

runtime常識(shí):
Ivar:成員變量星虹,在runtime中,變量只有一個(gè)數(shù)據(jù)類型镊讼,就是Ivar
Method:成員方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宽涌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蝶棋,更是在濱河造成了極大的恐慌卸亮,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玩裙,死亡現(xiàn)場(chǎng)離奇詭異兼贸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吃溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門溶诞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人决侈,你說我怎么就攤上這事螺垢。” “怎么了赖歌?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵甩苛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我俏站,道長(zhǎng)讯蒲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任肄扎,我火速辦了婚禮墨林,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犯祠。我一直安慰自己旭等,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布衡载。 她就那樣靜靜地躺著搔耕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弃榨,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天菩收,我揣著相機(jī)與錄音,去河邊找鬼鲸睛。 笑死娜饵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的官辈。 我是一名探鬼主播箱舞,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拳亿!你這毒婦竟也來了晴股?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肺魁,失蹤者是張志新(化名)和其女友劉穎电湘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體万搔,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年官帘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞬雹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刽虹,死狀恐怖酗捌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涌哲,我是刑警寧澤胖缤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站阀圾,受9級(jí)特大地震影響哪廓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜初烘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一涡真、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肾筐,春花似錦哆料、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唬渗,卻和暖如春典阵,著一層夾襖步出監(jiān)牢的瞬間奋渔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工萄喳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卒稳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓他巨,卻偏偏與公主長(zhǎng)得像充坑,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子染突,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 對(duì)于從事 iOS 開發(fā)人員來說捻爷,所有的人都會(huì)答出【runtime 是運(yùn)行時(shí)】什么情況下用runtime?大部分人能...
    夢(mèng)夜繁星閱讀 3,726評(píng)論 7 64
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,726評(píng)論 0 9
  • 蘋果官方文檔查找地址:https://developer.apple.com/library/mac/naviga...
    6ffd6634d577閱讀 338評(píng)論 0 1
  • 1. runtime的簡(jiǎn)介runtime是一套比較底層的純C語言API, 屬于1個(gè)C語言庫, 包含了很多底層的C語...
    凸阿濱閱讀 320評(píng)論 0 0
  • (本文是恰恰好sir的第8篇文章,閱讀大約需要8分鐘司志,感謝關(guān)注) ——那些你以為堅(jiān)固甜紫,持久,理所應(yīng)當(dāng)?shù)挠H密關(guān)系骂远,往...
    恰恰好sir閱讀 2,252評(píng)論 1 10