本章介绍如何提供方法的动态决议
有时候我们想要为一个方法动态地提供实现,比如Objective-C的@dynamic指示符,它告诉编译器与属性对应的方法是动态提供的。
@dynamic propertyName;
我们可以利用resolveInstanceMethod:和resolveClassMethod:分别为对象方法和类方法提供动态实现。一个Objective-C方法本质上是一个拥有至少两个参数(self和_cmd)的C函数,我们可以利用class_addMethod向一个类添加一个方法。比如对于下面的函数:
我们可以利用resolveInstanceMethod:将它添加成一个方法(比如叫resolveThisMethodDynamically):
- void dynamicMethodIMP (id self, SEL _cmd) {
- // implementation ….
- }
- @implementation MyClass
- + (BOOL)resolveInstanceMethod:(SEL)aSEL
- {
- if (aSEL == @selector(resolveThisMethodDynamically)) {
- class_addMethod( [self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
- return YES;
- }
- return [super resolveInstanceMethod:aSEL];
- }
- @end
Dynamic Loading--动态加载
Objective-C程序可以在运行时链接新的类和category。动态加载可以用来做很多不同的事情,比如System Preferences里头各种模块就是动态加载的。尽管有运行时函数可以动态加载Objective-C模块(objc/objc-load.h中的objc_loadModules),但Cocoa的NSBundle类提供了更方便的动态加载接口。
我们可以利用resolveInstanceMethod:和resolveClassMethod:分别为对象方法和类方法提供动态实现。一个Objective-C方法本质上是一个拥有至少两个参数(self和_cmd)的C函数,我们可以利用class_addMethod向一个类添加一个方法。比如对于下面的函数:
我们可以利用resolveInstanceMethod:将它添加成一个方法(比如叫resolveThisMethodDynamically):