2016-05-05 5 views
0

私は目的関数の関数をswizzleしたい。問題は、 - 私は実行時にのみスウィズルする必要があることを知っています。コード内のメソッドが異なると、戻り値の型や入力パラメータなどが異なります。関数のスウィズリングと実行時に知られている関数

関数とクラスの名前が与えられている場合は、ブロックを作成できます(汎用コード) imp_implementationWithBlockを使用してIMPを作成し、この新しく作成されたIMPを使用して元のメソッドをスウィズルします。

答えて

1

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

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

ランタイム-スウィズルあなたは何をやっている知っているとセレクタが存在しない場合は正常に失敗を確認する必要があります。

+0

私は、例外をスローしている関数fooを持っているとします。私はこの関数の本体をtry-catchブロックで囲みたい。 したがって、この関数fooからブロックを作成する必要があり、ブロックはまったく同じシグネチャでなければなりません。このブロックには、元のメソッドを呼び出すtry-catchがあります。その後、元のコードを新しいブロックに変更します。 したがって、fooを呼び出すと、そのブロックに実装されているtry-catchが呼び出されます。 実行時にブロックを作成できません。コンパイル時に引数と戻り値の型がわからないからです。 – prabodhprakash

+0

アスペクトは、前、後、代わりにのみ提供されます。私はtry-catchでそれを囲む必要があります。アスペクトを使用する方法はありますか? – prabodhprakash

+0

また、このブロックの例では、関数に引数を渡す方法はありますか?私たちはusingBlockでそれを供給する必要があります。 – prabodhprakash

関連する問題