неявное преобразование указателя Objective C в 'void *' запрещено с помощью ARC - sqlite3 - PullRequest
3 голосов
/ 23 ноября 2011

Я получаю эту ошибку, когда пытаюсь сделать это, используя ARC со следующим кодом SQLite:

NSMutableArray *rows = [[NSMutableArray alloc] init];
sqlite3_exec(database, "select distinct category from billy", callback, rows, NULL);

Кто-нибудь знает, как это исправить?

1 Ответ

6 голосов
/ 23 ноября 2011

Имейте в виду, что я никогда не выполняю ARC, но приведение параметра строк к (__bridge_retained void *) должно помочь, если я правильно понимаю документ.

Вот код, который я использую для тестирования.

static int myCallback(void* ptr, int i, char** p1, char** p2) {
    NSMutableArray* array = (__bridge_transfer NSMutableArray*)ptr;
    return 0;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSMutableArray *rows = [[NSTestMutableArray alloc] init];
    sqlite3_exec(NULL, "select distinct category from billy", &myCallback, (__bridge_retained CFMutableArrayRef)rows, NULL);
}

(__ bridge_transfer) - для передачи права собственности обратно, поэтому ARC освободит его правильно. Я перезаписываю dealloc моего NSTestMutableArray, чтобы показать, что он действительно освобожден, и он не будет освобожден, если я прокомментирую строку __bridge_transfer.

...