当我尝试使用带有以下SQLite代码的ARC执行此操作时,我收到了该错误:
NSMutableArray *rows = [[NSMutableArray alloc] init];
sqlite3_exec(database, "select distinct category from billy", callback, rows, NULL);
任何人都知道如何解决这个问题?
答案 0 :(得分:6)
请注意,我从不执行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将正确释放它。我重写了我的NSTestMutableArray的dealloc,以表明它已经被释放,如果我评论__bridge_transfer行,它将不会被释放。