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