本節(jié)講述怎樣動(dòng)態(tài)的為一個(gè)方法提供方法實(shí)現(xiàn)
Dynamic Method Resolution
在某些情況下,你也許想動(dòng)態(tài)的提供一個(gè)方法實(shí)現(xiàn)。例如,Objective-C聲明屬性時(shí)使用@dynamic指令
@dynamic propertyName;
這條指令告訴編譯器和該屬性相關(guān)的方法將動(dòng)態(tài)的提供。
你可以實(shí)現(xiàn)resolveInstanceMethod:或者resolveClassMethod:來動(dòng)態(tài)的為一個(gè)實(shí)例方法或者類方法提供實(shí)現(xiàn)
一個(gè)Objective-C方法就是一個(gè)至少含有self和_cmd兩個(gè)參數(shù)的C函數(shù)。運(yùn)用class_addMethod函數(shù),你可以把一個(gè)函數(shù)轉(zhuǎn)換為為一個(gè)類的新方法。因此,對(duì)于下面的函數(shù)
void dynamicMethodIMP(id self, SEL _cmd) {
// implementation ....
}
我們可以通過resolveInstanceMethod:方法,動(dòng)態(tài)的將上面這個(gè)函數(shù)轉(zhuǎn)換為一個(gè)類的新方法(這里命名為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
一個(gè)類可以有機(jī)會(huì)在轉(zhuǎn)發(fā)機(jī)制(forwarding mechanism)觸發(fā)前動(dòng)態(tài)的處理方法實(shí)現(xiàn)。如果調(diào)用respondsToSelector: 或者instancesRespondToSelector:,那么動(dòng)態(tài)方法可以為選擇器先提供一個(gè)IMP。如果你實(shí)現(xiàn)了resolveInstanceMethod:方法,但是卻希望某些選擇器通過轉(zhuǎn)發(fā)機(jī)制實(shí)現(xiàn),那么你只需在相應(yīng)的選擇器下設(shè)置返回值為NO。