Mac OS上的SQLite中的EXC_BAD_ACCESS

时间:2010-01-23 22:58:10

标签: cocoa sqlite exc-bad-access fmdb

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

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

我在数据库上打了几百个电话后得到EXC_BAD_ACCESS但从不同时。它也与内存无关(我已经尝试了NSZombies并查看了参数的内存管理)。

这是堆栈和代码:

alt text 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"];

我不知道,有人有吗?

1 个答案:

答案 0 :(得分:2)

查看FMDatabase中的相关代码,似乎sqlite_bind_text()例程使用SQLITE_STATIC参数绑定结果NSString的{​​{1}}方法(返回-UTF8String指针)。

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

我建议在每个SQLITE_TRANSIENT电话中进行更改,看看它是否仍然崩溃。如果修复它,您可能希望将其报告给开发人员,作为可能的改进。