3

Objective-C から ac 関数を呼び出し、objective-c 関数をコールバックとして渡したい

問題は、この関数がパラメーターとしてコールバックを持っているため、目的の c 関数を c 関数へのコールバックとして渡す必要があることです。

ここにc関数のヘッダーがあります

        struct mg_context *mg_start(const struct mg_callbacks *callbacks,
                        void *user_data,
                        const char **configuration_options);

ここで私はそれを呼び出そうとします

- (void)serverstarted
{
    NSLog(@"server started");
}


- (IBAction)startserver:(id)sender {
   NSLog(@"server should start");
   const char *options[] =
   {
       "document_root", "www",
       "listening_ports", "8080",
        NULL
   };
   mg_start(serverstarted(), NULL, options);
  }

私はそれを行うためにいくつかの方法を試し、ウェブを検索してそれを行う方法の手がかりを得ましたが、運はありませんでした

これが私のコードに含まれているライブラリです

https://github.com/valenok/mongoose

4

2 に答える 2

3

matt が既に述べたように、C 関数が必要なコールバックとして Objective-C メソッドを渡すことはできません。Objective-C メソッドは特別な関数です。特に、レシーバー (「self」) は関数の最初の引数として暗黙的に渡されます。

したがって、Objective-C メソッドを要求ハンドラーとして使用するには、ハンドラーとして (中間) C 関数が必要であり、引数selfを使用してその関数に渡す必要があります。user_dataその後、C 関数は Objective-C メソッドを呼び出すことができます。

// This is the Objective-C request handler method:
- (int)beginRequest:(struct mg_connection *)conn
{
    // Your request handler ...
    return 1;
}

// This is the intermediate C function:
static int begin_request_handler(struct mg_connection *conn) {
    const struct mg_request_info *request_info = mg_get_request_info(conn);
    // Cast the "user_data" back to an instance pointer of your class:
    YourClass *mySelf = (__bridge YourClass *)request_info->user_data;
    // Call instance method:
    return [mySelf beginRequest:conn];
}

- (IBAction)startserver:(id)sender
{
    struct mg_callbacks callbacks;
    memset(&callbacks, 0, sizeof(callbacks));
    callbacks.begin_request = begin_request_handler;
    const char *options[] =
    {
        "document_root", "www",
        "listening_ports", "8080",
        NULL
    };
    // Pass "self" as "user_data" argument:
    mg_start(&callbacks, (__bridge void *)self, options);
}

備考:

  • ARC (自動参照カウント) を使用しない場合は、(__bridge ...) キャストを省略できます。
  • サーバーの実行中にクラスのインスタンス (「self」) の割り当てが解除されないようにする必要があります。そうしYourClass *mySelf ないと、リクエスト ハンドラが呼び出されたときに無効になります。
于 2013-04-19T17:23:07.280 に答える