0

また、この関数が別の関数に渡されるため、ViewController ポインターを渡すことができないことに注意してください。

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    NSString *str = @""; 

    int i;

    for(i=0; i<argc; i++)
    {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
        str = [NSString stringWithFormat:@"%@\n%s = %s\n", str, azColName[i], argv[i] ? argv[i] : "NULL"];
    }
    printf("\n");


    //tvDisplay is a UITextView
    [tvDisplay setText:str]; // <---- ??? how to get to an iVar
    return 0;
}

呼び出し:

rc = sqlite3_exec(db, pSQL[i], callback, 0, &zErrMsg);
4

1 に答える 1

2

void *コールバック関数には通常、任意のデータ(通常は呼び出されたコンテキストなど)を渡すことができる引数があります。コールバック関数を設定するときにアクセスする必要のあるオブジェクトを渡して、コールバック関数内で取得できます。

static void myCallback(int someResult, void *context) {
   SomeClass *someObject = (SomeClass *)context;
   [someObject doStuff];
}

特定のケースでは、「コールバック関数でアクセスする任意のデータ」の場所は、void *現在0に設定しているコールバック関数自体の直後の引数です。

int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

コールバックがまだ返されていない間、そこに保持するデータが有効であり続けるようにする責任があることを覚えておいてください。必要に応じて、コールバックでデータを解放してください。

于 2012-06-29T00:31:27.067 に答える