2009-08-10 11 views
1

既存のデリゲートからのみ、CERTAIN機能をオーバーライドすることは可能ですか?既存の共有デリゲートのオーバーライド/スウィズリングメソッド

私は私で、ターゲット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:)]; 

が機能していないが私のメソッドは、呼び出されていない:(

+0

質問をする方法を見つけました。なぜバッジを獲得して、TAOCPの質問にあなたの「無回答」を削除して削除してはどうですか? – tvanfosson

+0

私は編集し、改名し、質問のタグを付け直しました。タイトルを短くして質問に説明するのが最善です。また、** [OBJ-C] **をタイトル接頭辞などにするのではなく、タグを分類するようにしてください。 –

答えて

3

あなたはおそらくメソッド構造体を直接操作するべきではないでしょう。ランタイム関数を代わりに使用してください。#ランタイムヘッダをインポートする必要がありますが、そこにはmethod_setImplementationという素晴らしいメソッドがあります。 class_getInstanceMethodを採用プロトコルで定義されたメソッドのためのメソッドを返さない場合がありますので、これは、あなたの特定のケースのために動作しない場合がありますが、これはスウィズルする「正しい」方法です

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

:それはこのような何かをうまくいきますメソッドIMP。

+0

EXC_BAD_ACCESS GDBエラー: '{ – RealHIFIDude

+0

}これはあなたの特定のケースではうまくいかないかもしれません。どのようにあなたのメソッド構造体を取得していますか? –

関連する問題