Runtime(二)动态方法简析

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容