Runtime(二)動(dòng)態(tài)方法簡(jiǎn)析

Dynamic Method Resolution

你可以使用resolveInstanceMethod: 和 resolveClassMethod: 分別為實(shí)例和類的selector__動(dòng)態(tài)__地提供實(shí)現(xiàn)(implementation)。

Person.h
- (void)run;

Person.m
不為run提供implementation

viewController.m
- (BOOL)resolveInstanceMethod:(SEL)selector {
  if(selector == @selector(run)) {
    [self runDynamic];
    return YES;
  }
  return [super resolveInstanceMethod:selector];
}

- (void)runDynamic {
  NSLog(@"runDynamic");
}

OC的方法可以簡(jiǎn)單的認(rèn)為是:至少帶有self和_cmd的C函數(shù)。用函數(shù)class_addMethod為類增加一個(gè)方法。

Person.h
- (void)run;
//為Person動(dòng)態(tài)添加一個(gè)計(jì)數(shù)類方法stepCount

ViewController.m
- (BOOL)resolveInstanceMethod:(SEL)selector {
  if(selector == @selector(run)) {
    class_addMethod([self class], selector, (IMP)stepCount, "v@:");
    return YES;
  }
  return [super resolveInstanceMethod:selector];
}

- (void)stepCount(id self, SEL _cmd) {

  //implementation
}

動(dòng)態(tài)方法簡(jiǎn)析可以保證一個(gè)class或instance在消息轉(zhuǎn)發(fā)機(jī)制生效前,動(dòng)態(tài)簡(jiǎn)析一個(gè)方法。

Dynamic Loading

一個(gè)OC的程序(program)可以在運(yùn)行時(shí)(running)加載(load)和鏈接(link)新的類和類別。這些新的代碼會(huì)合并(incorporate)到程序中,且和開始加載的類和類別被同等對(duì)待。

盡管runtime提供了動(dòng)態(tài)加載的函數(shù)objc_loadModules,但是Cocoa的NSBundle類提供了更加高效,方便的接口(interface)。

動(dòng)態(tài)加載可以做很多不同的事情:

  • 減小可執(zhí)行文件的大小,如你不在.m文件import <AVFoundation>時(shí),而是動(dòng)態(tài)的在running再加載<AVFoundation>。
  • 不同模塊動(dòng)態(tài)加載。
  • 動(dòng)態(tài)加載允許應(yīng)用自定義,其他人可以寫在runtime加載的模塊(modules)。

有這么個(gè)例子:我的一個(gè)lib需要根據(jù)網(wǎng)絡(luò)反饋來加載不同的內(nèi)容,那么按照動(dòng)態(tài)lib的思路,即可保證lib不加載不必要的內(nèi)容。

對(duì)動(dòng)態(tài)加載介紹的文章:
iOS開發(fā)-動(dòng)態(tài)庫(kù)加載(實(shí)時(shí)模塊更新)
iOS dlopen 動(dòng)態(tài)加載Frameworks

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容