Dynamic Method Resolution(文档翻译)

本节讲述怎样动态的为一个方法提供方法实现

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。

你可能感兴趣的:(Dynamic Method Resolution(文档翻译))