1

是否可以仅覆盖现有委托的某些功能,而我们自己却完全不是委托?

我尝试用我的替换目标 IMP,没有工作:'(

更多详情:


+[SomeClass sharedDelegate]

-[sharedDelegate targetMethodToBeOverridden:Arg:] //OUR method needs to be called, not this

Method *targetMethod;  // targetMethodToBeOverridden identified by class_copymethodlist magic

targetMethod->method_imp =  [self methodForSelector:@selector(overriddenDelegateMethod:Arg:)];

不工作!我的方法没有被调用:(

4

1 回答 1

3

您可能不应该直接操作 Method 结构。请改用运行时函数。您需要#import 运行时标头,但其中有一个很好的方法,称为 method_setImplementation。它会像这样工作:

id targetObject = [SomeClass sharedDelegate];
Method methodToModify = class_getInstanceMethod([targetObject class], @selector(replaceMe:argument:));
IMP newImplementation = [self methodForSelector:@selector(overriddenDelegateMethod:Arg:)];
method_setImplementation(methodToModify, newImplementation);

这可能不适用于您的特定情况,因为 class_getInstanceMethod 可能不会为采用的协议定义的方法返回 Method,但这是调配 Method IMP 的“正确”方式。

于 2009-08-10T16:15:18.127 回答