1

私はObjective-Cを初めて使用するので、次の問題を克服する必要があります。Cライブラリのフロントエンドを開発しようとしていますが、Objective-Cメンバー関数のアドレスを取得してライブラリに渡す必要があります。

例:これがC++で行うことです

class MyClass
{
    public:
    void my function();
    void some_other_function()
    { connect_signal(my_function); }
};

ここでは、のアドレスmy_function()をconnect_signalに渡すだけです。それはObjective-Cで可能ですか?他のアイデアはありますか?

私の2番目の選択肢は、Objective-C関数を呼び出すクラスからC関数を単純に作成することです。

前もって感謝します

4

3 に答える 3

5

指定されたセレクターのメソッドの実装へのポインターをmethodForSelector:返すメソッドがあります(関連する質問)。それはあなたが求めているものですか?IMP

そして、より一般的な意見として、メソッド実装へのポインターを使用することは、通常、あまりにも魔法です。ユースケースに対して、より高レベルでより「普通の」ソリューションはありますか? (あなたが質問に書いたことから詳細を想像することはできません。)

于 2013-03-13T16:30:26.187 に答える
3

記録のために、シグナルを非静的 C++ 関数に接続することはできません。少なくとも信号の *nix の意味ではありません。これらには、this呼び出し用のポインターが必要です。

さて、目的の C について。何をしたいかによって異なります。目的の C メソッドへのポインターをプレーン C API に渡すか、独自のシグナルのようなコールバック メカニズムを実装します。他の答えは前者に集中しています。後者について話しましょう。

自然な動作は、セレクターとオブジェクト ポインターの組み合わせを渡すことです。セレクターにはデータ型SELがあり、@selector() コンストラクトを使用して取得されます。セレクターは、クラス階層内のメソッドを一意に識別するデータ (実際には整数) です。

コールバックを必要とするconnect_signal関数がどこかにあるとします。

-(void)connect_signal:(SEL)callbackSelector forObject:(NSObject*)callbackObject;

次のように呼び出します (コールバック オブジェクト内から):

[xx connect_signal:@selector(MyMethod:) forObject:self];

関数内で、セレクターとオブジェクト ポインターを保存します。コールバックを呼び出す必要がある場合は、次の呼び出しを発行します。

[SavedCallbackObject performSelector:(SavedCallbackSelector) withObject: nil];

2 番目のパラメーターは、パラメーターをコールバックに渡すためのものです。複数必要な場合は、NSInvoke を参照してください。

私の答えは、ココアを想定しています。たとえば、NSObject は Cocoa クラスです。ObjC に関する最近の質問は安全な賭けです。

または、古き良き関数ポインターを使用できます。彼らはまだ周りにいます。

于 2013-03-13T16:36:42.060 に答える
2

Objective-C メソッドの実装 (IMP) は、少なくとも2 つの引数を取る C 関数です。メソッド呼び出しのターゲット (self) と呼び出されるセレクター (_cmd)。

したがって、IMP を C API に渡しても機能しません。

あなたの最善の策は、C関数を渡すことです。C API が適切で、「任意のユーザー コンテキスト ポインター」があると仮定すると、次のようになります。

void myfunc(void *context) {
    [(MyClass *)context callback];
} 
于 2013-03-13T16:34:32.930 に答える