本節講述怎樣動態的為一個方法提供方法實現
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。