0

Objective-C で関数をスウィズルしたい。問題は、実行時にのみスウィズルする必要がある関数を知っていることです。コード内のさまざまなメソッドには、さまざまな戻り値の型、入力パラメーターなどがあります。

関数とそれが属するクラスの名前が与えられた場合、ブロックを作成し、imp_implementationWithBlock を使用して IMP を作成し、この新しく作成された IMP で元のメソッドをスウィズルできる (ジェネリック) コードをどのように記述すればよいでしょうか。

4

1 に答える 1

1

NSSelectorFromString()セレクター名を動的に検索してから、スウィズリングを実行するために使用できます。多くのヘルパーがあるので、正確なスウィズル ロジックを繰り返す必要はありません。たとえば、アスペクトを使用する場合、コードは次のようになります。

[_singleTapGesture aspect_hookSelector:NSSelectorFromString(@"setState:") withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {
    NSLog(@"%@: %@", aspectInfo.instance, aspectInfo.arguments);
} error:NULL];

ランタイム スウィズリングでは、自分が何をしているのかを確認し、セレクターが存在しない場合は正常に失敗するようにする必要があります。

于 2016-05-05T06:51:24.513 に答える