我正在从sqlite数据库中提取和推送数据。我使用FMDatabase可可包装器。
我正在从多个线程中提取和推送数据,但我确保不会同时发生多个事务。
我在数据库上打了几百个电话后得到EXC_BAD_ACCESS
但从不同时。它也与内存无关(我已经尝试了NSZombies并查看了参数的内存管理)。
这是堆栈和代码:
FMResultSet* result = [db executeQuery:@"select latitude, longitude from cache where name = ?", name];
[result next];
NSString* latitude = [result stringForColumn:@"latitude"];
NSString* longitude = [result stringForColumn:@"longitude"];
我不知道,有人有吗?
答案 0 :(得分:2)
查看FMDatabase
中的相关代码,似乎sqlite_bind_text()
例程使用SQLITE_STATIC
参数绑定结果NSString
的{{1}}方法(返回-UTF8String
指针)。
这意味着autoreleased
假定只要文本保持绑定,文本存储将保持有效,而SQLite
返回仅对当前自动释放上下文有效。如果您在多个线程或函数调用上使用相同的-UTF8String
,则将该参数更改为FMResultSet
会更安全。
我建议在每个SQLITE_TRANSIENT
电话中进行更改,看看它是否仍然崩溃。如果修复它,您可能希望将其报告给开发人员,作为可能的改进。