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 时,而是动态的在running再加载
  • 不同模块动态加载。
  • 动态加载允许应用自定义,其他人可以写在runtime加载的模块(modules)。

有这么个例子:我的一个lib需要根据网络反馈来加载不同的内容,那么按照动态lib的思路,即可保证lib不加载不必要的内容。

对动态加载介绍的文章:
iOS开发-动态库加载(实时模块更新)
iOS dlopen 动态加载Frameworks

你可能感兴趣的:(Runtime(二)动态方法简析)