2

我正在从 sqlite 数据库中提取和推送数据。我使用 FMDatabase 可可包装器。

我正在从多个线程中提取和推送数据,但我确保不会同时发生一个以上的事务。

EXC_BAD_ACCESS在数据库上打了几百次电话,但从来没有同时打过电话。它也与内存无关(我尝试过 NSZombies 并查看了参数的内存管理)。

这是堆栈和代码:

替代文字 http://grab.by/1VwY

FMResultSet* result = [db executeQuery:@"select latitude, longitude from cache where name = ?", name];
[result next];

NSString* latitude = [result stringForColumn:@"latitude"];
NSString* longitude = [result stringForColumn:@"longitude"];

我不知道,有人有吗?

4

1 回答 1

2

查看 中的相关代码FMDatabase,似乎sqlite_bind_text()例程使用SQLITE_STATIC参数来绑定 resultNSString-UTF8String方法(返回一个autoreleased指针)。

这意味着SQLite假定只要文本保持绑定,文本存储将保持有效,而-UTF8String返回仅对当前的自动释放上下文有效。如果您在FMResultSet多个线程或函数调用中使用相同的参数,则将该参数更改为SQLITE_TRANSIENT会更安全。

我建议在每次sqlite3_bind_text()通话中进行更改,看看它是否仍然崩溃。如果解决了问题,您可能希望将其报告给开发人员作为可能的改进。

于 2010-01-24T16:29:38.273 回答