本节讲述怎样动态的为一个方法提供方法实现
Dynamic Method Resolution
在某些情况下,你也许想动态的提供一个方法实现。例如,Objective-C声明属性时使用@dynamic指令
@dynamic propertyName;
这条指令告诉编译器和该属性相关的方法将动态的提供。
你可以实现resolveInstanceMethod:或者resolveClassMethod:来动态的为一个实例方法或者类方法提供实现
一个Objective-C方法就是一个至少含有self和_cmd两个参数的C函数。运用class_addMethod函数,你可以把一个函数转换为为一个类的新方法。因此,对于下面的函数
void dynamicMethodIMP(id self, SEL _cmd) {
// implementation ....
}
我们可以通过resolveInstanceMethod:方法,动态的将上面这个函数转换为一个类的新方法(这里命名为resolveThisMethodDynamically),如下:
@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
一个类可以有机会在转发机制(forwarding mechanism)触发前动态的处理方法实现。如果调用respondsToSelector: 或者instancesRespondToSelector:,那么动态方法可以为选择器先提供一个IMP。如果你实现了resolveInstanceMethod:方法,但是却希望某些选择器通过转发机制实现,那么你只需在相应的选择器下设置返回值为NO。