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

おそらく、メソッド構造体を直接操作するべきではありません。代わりにランタイム関数を使用してください。ランタイムヘッダーを#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は、採用されたプロトコルによって定義されたメソッドのメソッドを返さない可能性があるため、これは特定のケースでは機能しない場合がありますが、これはメソッドIMPをスウィズルする「適切な」方法です。

于 2009-08-10T16:15:18.127 に答える