渡されたクラスのメソッドを読んで、それらをすべて元のセレクタに転送する前に実行時に1つのセレクタにマップすることが理想的です。複数のメソッドswizzlesのメソッドIMPをコピーする
これは今でも動作しますが、一度に1つの方法でしか実行できません。問題は、一度私は最初のメソッドをswizzle、その方法をキャッチし、転送する私のIMPは、今は他のメソッドIMPと交換されているようだ。他のものを置き換えるために新しく交換されたIMPを使用するため、これ以上の試行はこれではねます。
1)したがって、私はMethodA、MethodB、およびCustomCatchAllMethodを持っています。
2)MethodAをCustomCatchAllMEthodと交換します。私はCustomCatchAllMethodを使ってMethodBにスワップしようとしていますが、CustomCatchAllMethod now = MethodA以降、MethodBはMethodAとMethodA-> MethodBになります。
それで、私が傍受したい新しいセレクターごとに、私のIMPの新しいインスタンスを取得/コピーするにはどうしたらいいですか?
ここでは上記の流れの大まかなモックアップだ:あなたが他のものと一つの方法をインターセプトしたいときの一般的な方法は、スウィズリングパターンのみ動作することを
void swizzle(Class classImCopying, SEL orig){
SEL new = @selector(catchAll:);
Method origMethod = class_getInstanceMethod(classImCopying, orig);
Method newMethod = class_getInstanceMethod(catchAllClass,new);
method_exchangeImplementations(origMethod, newMethod);
}
//In some method elsewhere
//I want this to make both methodA and methodB point to catchAll:
swizzle(someClass, @selector(methodA:));
swizzle(someClass, @selector(methodB:));
ありがとうございます!私はそれで何がうまくいくか見るつもりです。私はすでに呼び出しを転送し、IMPSを格納するためのかなり洗練されたシステムを持っていますので、それほど大きな問題ではないはずです。 –
それは本当にトリックをやったので、私はそれを逃したと信じることはできません。再度、感謝します! –