1

簡単なテスト (スタブなど) のために、いくつかの Objective-C ランタイム メソッドのラッパー クラスを作成したいと考えています。また、Objective-C メソッドから C 関数への可変引数の受け渡しをどのように処理するかを知りたいです。

たとえば、C 関数を次の関数シグネチャでラップしたいとします。

id objc_msgSend(id theReceiver, SEL theSelector, ...)

Objective-C メソッドに「...」演算子を使用できることは理解していますが、これを C 関数に渡すにはどうすればよいですか?

- (id)msgSend:(id)theReceiver selector:(SEL)theSelector, ...
{
    return objc_msgSend(theReceiver, theSelector, ...) // <-- how to pass variable arguments?
}
4

2 に答える 2

2

できません。可変引数は継承できません。va_listあなたができる最も近いことは、可変引数の代わりにa を取る関数のバリエーションを探し、 a を初期化va_listして関数に渡すことです。

昔は、objc_msgSend()というコンパニオン関数がありobjc_msgSendv()ました。それ以降、廃止され、削除されました。しかし、その関数を使用すると、次のことができます。

- (id)sendMessageTo:(id)selfish selector:(SEL)sel, ...
{
    va_list args;
    va_start(args, sel);
    id retVal = objc_msgSendv(selfish, sel, args);
    va_end args;
    return retVal;
}
于 2013-06-26T04:38:46.277 に答える
1

純粋な Cではこれを行うことはできません。しかし、この目的のためにlibffiが存在します。これは Apple によって言語ブリッジにも使用されています (または使用されています)。AOP フレームワークで使用しました。それは非常にうまく機能します。

于 2013-06-26T07:23:00.720 に答える