从静态函数中如何将信息放入iVars?

时间:2012-06-29 00:16:43

标签: objective-c cocoa-touch

请注意,由于此函数被传递到另一个函数,我无法传入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);

1 个答案:

答案 0 :(得分:2)

回调函数通常有一个参数,允许您传递任意数据(它通常是void *调用的上下文或类似的东西)。您可以在设置回调函数时传入需要访问的对象,然后在回调函数中检索它:

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

在您的特定情况下,“您想要在回调函数中访问的任意数据”的位置是您当前设置为0的回调函数本身之后的void *参数:

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 */
);

请记住,您有责任确保在回调尚未返回时,您所留在的任何数据仍然有效,如有必要,请在回调中将其释放。