2016-12-16 6 views
0

私はtweakアプリケーションを開発していますが、ヘッダーはインポートできないクラスを1つ作成したいと思いますが、クラス名、クラスメソッド、インスタンスメソッドは分かります。それはパラメータを持つクラスのメソッドですか? は私がやっている何をクラスメソッドIMPを使用したiOS呼び出しクラスメソッド

+(instancetype)do:(NSString*)string for:(NSString *)antherString; 

でMMClassと呼ばれるこのクラスは以下の通りであると言う:

Class class = objc_getClass("MMClass"); 
Method initMethod = class_getClassMethod(class, 
              @selector(do:for:)); 
IMP imp = method_getImplementation(initMethod); 
id instance = imp(class,@selector(do:for:),@"do",@"ye"); 

この権利ですか?

答えて

0

まず、明白なことを述べているかどうかはわかりませんが、使用する宣言を使用して独自のヘッダーを作成してインポートしないでください(またはファイルの先頭に宣言をインラインで1つのファイルでのみ使用します)。メソッドを通常は呼び出しますか?すべてのこの混乱を通過する代わりに?コンパイラが気にするのは、呼び出すメソッドの宣言がいくつかあることです。

あなたが関数ポインタを使用して、実際のメソッドの実装を呼び出すと、あなたはメソッドのシグネチャに対応する関数ポインタの右の型にキャストする必要があります。

Class class = objc_getClass("MMClass"); 
Method initMethod = class_getClassMethod(class, @selector(do:for:)); 
IMP imp = method_getImplementation(initMethod); 
id (*foo)(Class, SEL, NSString *, NSString *) = 
    (id (*)(Class, SEL, NSString *, NSString *))imp; 
id instance = foo(class, @selector(do:for:), @"do", @"ye"); 

しかし、それはIMPを取得するために愚かですあなたは一度だけ使うつもりです。むしろ、objc_msgSendを目的の関数ポインタ型にキャストして、代わりに直接呼び出す必要があります。

関連する問題