【问题标题】:implicit conversion of an Objective-C pointer to 'void *' is disallowed with ARC - sqlite3ARC不允许将Objective-C指针隐式转换为'void *' - sqlite3
【发布时间】:2012-01-04 21:55:48
【问题描述】:

当我尝试使用带有以下 SQLite 代码的 ARC 执行此操作时,我遇到了该错误:

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

有人知道如何解决这个问题吗?

【问题讨论】:

  • 能否也提供回调函数的代码?这可能会影响这里的答案。

标签: iphone objective-c ios sqlite automatic-ref-counting


【解决方案1】:

请注意,我从不使用 ARC,但如果我正确理解文档,将 rows 参数转换为 (__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 行,它不会被释放。

【讨论】:

  • 这给了我一个潜在的行泄漏警告。如果我将 __bridge_transfer 和 __bridge_retained 都更改为 __bridge,则代码可以正常工作并且不会收到警告。
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多