17

C ライブラリを使用する Objective-C アプリケーションを作成しています。私が現在直面している問題は、C ライブラリには、一部のフィールドが後でコールバックとして使用される関数ポインターである構造があることです。Objective-C インスタンス メソッドを関数ポインタに変換してライブラリに渡すにはどうすればよいですか?

4

1 に答える 1

20

Objective-C クラスの実装ファイル内で C コールバック関数を提供する必要があります。これは、コールバックが何らかのコンテキストポインタを使用できる場合にのみ機能します。

C のコールバック シグネチャが次のようになっていると想像してください。

void myCallback(void *context, int someOtherInfo);

次に、Objective-C クラスの実装ファイル内で、そのコールバックを使用して、Objective-C クラスにトランポリンで戻る必要があります (呼び出すクラスのインスタンスとしてコンテキストポインターを使用します)。

// Forward declaration of C callback function
static void theCallbackFunction(void *context, int someOtherInfo);

// Private Methods
@interface MyClass ()
- (void)_callbackWithInfo:(int)someOtherInfo;
@end

@implementation MyClass

- (void)methodToSetupCallback
{
    // Call function to set the callback function, passing it a "context"
    setCallbackFunction(theCallbackFunction, self);
    ...
}

- (void)_callbackWithInfo:(int)someOtherInfo
{
    NSLog(@"Some info: %d", someOtherInfo);
}

@end

static void theCallbackFunction(void *context, int someOtherInfo)
{
    MyClass *object = (MyClass *)context;
    [object _callbackWithInfo:someOtherInfo];
}

C コールバック関数が何らかのコンテキスト情報を受け入れない場合は、次のようになります。

  1. これは壊れており、これはバグとして修正/報告する必要があります。
  2. C コールバック関数で使用されるように、グローバルで静的なスコープで自己へのポインターを格納することに依存する必要があります。MyClassこれにより、 のインスタンス数が1 つに制限されます。
于 2013-03-01T12:34:42.037 に答える