iOS 運行時 Runtime 運用解析

在 iOS 開發(fā)中,我們可能會使用 Runtime 來解決問題讶隐,當(dāng)然我們可能都接觸過 Runtime,有的小伙伴已經(jīng)很熟悉了升酣,有的小伙伴也可能不是特別清楚,為了讓小伙伴們更好地使用 Runtime态罪,我對 Runtime 做了一個小小的封裝噩茄,先看一下效果吧。

Runtime 運用

使用說明

  • 導(dǎo)入頭文件
#import "DYFRuntimeWrapper.h"
  • Runtime 應(yīng)用介紹
  1. 獲取所有方法名复颈,例如獲取 UITableView 的方法名:
NSArray *list = [DYFRuntimeWrapper yf_getAllMethodsWithClass:[UITableView class]];

for (NSString *name in list) {
    NSLog(@">>>> %@", name);
}
  1. 獲取所有屬性名绩聘,例如獲取 UILabel 的屬性變量:
NSArray *list = [DYFRuntimeWrapper yf_getAllIvarsWithClass:[UILabel class]];

for (NSString *name in list) {
    NSLog(@">>>> %@", name);
}
  1. 添加一個方法
+ (void)load {
    [DYFRuntimeWrapper yf_addMethodWithClass:[self class] methodName:@"hello" impClass:[self class] impName:@"sayHello"];
}

- (void)viewDidLoad {
    [super viewDidLoad];

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [self performSelector:NSSelectorFromString(@"hello")];
#pragma clang diagnostic pop
}

- (void)sayHello {
    NSLog(@">>>> %s", __FUNCTION__);
}
  1. 交換兩個方法
- (IBAction)exchangeMethod:(id)sender {
    [DYFRuntimeWrapper yf_exchangeMethodWithSourceClass:[self class] sourceSel:@selector(preload) targetClass:[self class] targetSel:@selector(refreshUI)];
}

- (void)preload {
    NSString *str = [NSString stringWithFormat:@"%s\n", __FUNCTION__];
    NSLog(@">>>> str1: %@", str);
    self.displayView.text = [self.displayView.text stringByAppendingString:str];
    NSLog(@">>>> self.displayView.text: %@", self.displayView.text);
}

- (void)refreshUI {
    NSString *str = [NSString stringWithFormat:@"%s-%@\n", __FUNCTION__, self.randomString];
    NSLog(@">>>> str2: %@", str);
    self.displayView.text = [self.displayView.text stringByAppendingString:str];
    NSLog(@">>>> self.displayView.text: %@", self.displayView.text);
}

- (NSString *)randomString {
    uint32_t a = arc4random_uniform(2);
    unsigned int len = (a == 1) ? 40 : 32;
    char data[len];
    for (int x = 0; x < len; x++) {
        uint32_t ar = arc4random_uniform(2);
        char ch = (char)(((ar == 1) ? 'A' : 'a') + (arc4random_uniform(26)));
        data[x] = ch;
    }
    return [[NSString alloc] initWithBytes:data length:len encoding:NSUTF8StringEncoding];
}
  1. 替換某個方法
- (IBAction)replaceMethod:(id)sender {
    [DYFRuntimeWrapper yf_replaceMethodWithSourceClass:[self class] sourceSel:@selector(preload) targetClass:[self class] targetSel:@selector(refreshUI)];
}
// 同上
  1. 字典轉(zhuǎn)模型
- (IBAction)dictToModel:(id)sender {
    NSDictionary *dict = @{@"name": self.nameTF.text,
                           @"gender": self.genderTF.text,
                           @"age": self.ageTF.text};
    YFModel *model = [DYFRuntimeWrapper yf_modelWithDict:dict modelClass:[YFModel class]];
    self.displayView.text = [self.displayView.text stringByAppendingString:[NSString stringWithFormat:@"\nname: %@\ngender: %@\nage: %@", model.name, model.gender, model.age]];
}
  1. 歸檔解檔
- (void)viewDidLoad {
    [super viewDidLoad];
    // 創(chuàng)建路徑
    NSString *documentPath      = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject];
    NSString *filePath          = [documentPath stringByAppendingPathComponent:@"YFModel.plist"];
    self.filePath               = filePath;
}

- (IBAction)archive:(id)sender {
    YFModel *model = [YFModel new];
    model.name     = self.nameTF.text;
    model.gender   = self.genderTF.text;
    model.age      = self.ageTF.text;
    
    BOOL ret = [DYFRuntimeWrapper yf_archive:[model class] model:model filePath:self.filePath];
    if (ret) {
        NSLog(@">>>> 歸檔成功:%@", self.filePath);
    } else {
        NSLog(@">>>> 歸檔失敗:睦病T淦小!");
    }
}

- (IBAction)unarchive:(id)sender {
    self.displayView.text = @"解檔后的數(shù)據(jù):";
    
    YFModel *m = [DYFRuntimeWrapper yf_unarchive:[YFModel class] filePath:self.filePath];
    
    self.displayView.text = [self.displayView.text stringByAppendingString:[NSString stringWithFormat:@"\nname: %@\ngender: %@\nage: %@", m.name, m.gender, m.age]];
}
  1. 添加分類屬性
  • 導(dǎo)入頭文件#import <objc/message.h>

  • 聲明屬性

/** 居住地址 */
@property (nonatomic, copy) NSString *address;
  • 申明一個key值
static NSString *kHomeAddress = @"kHomeAddress";
  • 重寫setter帜讲、getter方法
 // getter
- (NSString *)address {
    return objc_getAssociatedObject(self, &kHomeAddress);
}

// setter
- (void)setAddress:(NSString *)address {
    objc_setAssociatedObject(self, &kHomeAddress, address, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

這樣就成功添加了一個分類屬性衅谷。

Runtime 應(yīng)用的封裝主要實現(xiàn)都在 DYFRuntimeWrapper 類中,如果需要快速使用 Runtime似将,就去查看或下載 Demo获黔。


點贊+關(guān)注,第一時間獲取技術(shù)干貨和最新知識點在验,謝謝你的支持玷氏!

最后祝大家生活愉快~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腋舌,隨后出現(xiàn)的幾起案子盏触,更是在濱河造成了極大的恐慌,老刑警劉巖侦厚,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耻陕,死亡現(xiàn)場離奇詭異,居然都是意外死亡刨沦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門膘怕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來想诅,“玉大人,你說我怎么就攤上這事岛心±雌疲” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵忘古,是天一觀的道長徘禁。 經(jīng)常有香客問我,道長髓堪,這世上最難降的妖魔是什么送朱? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任娘荡,我火速辦了婚禮,結(jié)果婚禮上驶沼,老公的妹妹穿的比我還像新娘炮沐。我一直安慰自己,他們只是感情好回怜,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布大年。 她就那樣靜靜地躺著,像睡著了一般玉雾。 火紅的嫁衣襯著肌膚如雪翔试。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天复旬,我揣著相機與錄音垦缅,去河邊找鬼。 笑死赢底,一個胖子當(dāng)著我的面吹牛失都,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幸冻,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼粹庞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洽损?” 一聲冷哼從身側(cè)響起庞溜,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碑定,沒想到半個月后流码,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡延刘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年漫试,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碘赖。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡驾荣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出普泡,到底是詐尸還是另有隱情播掷,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布撼班,位于F島的核電站歧匈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏砰嘁。R本人自食惡果不足惜件炉,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一勘究、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妻率,春花似錦乱顾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孤里,卻和暖如春伏伯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捌袜。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工说搅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虏等。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓弄唧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霍衫。 傳聞我的和親對象是個殘疾皇子候引,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,092評論 1 32
  • 傳奇影業(yè)怪獸電影宇宙第三篇 《哥斯拉2:怪物之王》2019.5.31 承接2014年《哥斯拉》“帝王計劃”組織發(fā)現(xiàn)...
    夏洛克不養(yǎng)貓閱讀 1,148評論 0 4
  • 這是我最近看的育兒書,真是有了孩子以后敦跌,我真怕教不好她澄干,因為不想因為自己的想當(dāng)然就所以然的教孩子,我現(xiàn)在就深切的感...
    靜靜_ee7f閱讀 267評論 0 1
  • 2019年4月24日 星期三 晴 今天你學(xué)鋼琴的地方搞了一個練習(xí)指法的活動柠傍,六點鐘開始麸俘,我們要放了學(xué)趕緊回家吃飯,...
    劉芮希爸爸閱讀 156評論 0 0
  • 2 有了第一次的經(jīng)歷惧笛,我對相親不那么排斥了从媚。其實相親就是通過介紹相互認(rèn)識一下,覺得可以就加個微信聊一聊患整,離結(jié)婚還遠(yuǎn)...
    楓丹白露Town閱讀 172評論 0 2