Dynamic Method Resolution
你可以使用resolveInstanceMethod: 和 resolveClassMethod: 分别为实例和类的selector__动态__地提供实现(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的方法可以简单的认为是:至少带有self和_cmd的C函数。用函数class_addMethod为类增加一个方法。
Person.h
- (void)run;
//为Person动态添加一个计数类方法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
}
动态方法简析可以保证一个class或instance在消息转发机制生效前,动态简析一个方法。
Dynamic Loading
一个OC的程序(program)可以在运行时(running)加载(load)和链接(link)新的类和类别。这些新的代码会合并(incorporate)到程序中,且和开始加载的类和类别被同等对待。
尽管runtime提供了动态加载的函数objc_loadModules,但是Cocoa的NSBundle类提供了更加高效,方便的接口(interface)。
动态加载可以做很多不同的事情:
- 减小可执行文件的大小,如你不在.m文件import <AVFoundation>时,而是动态的在running再加载<AVFoundation>。
- 不同模块动态加载。
- 动态加载允许应用自定义,其他人可以写在runtime加载的模块(modules)。
有这么个例子:我的一个lib需要根据网络反馈来加载不同的内容,那么按照动态lib的思路,即可保证lib不加载不必要的内容。
对动态加载介绍的文章:
iOS开发-动态库加载(实时模块更新)
iOS dlopen 动态加载Frameworks