iPhone应用程序SQLite准备语句崩溃

时间:2012-05-03 07:10:50

标签: iphone ios

我正在构建的应用程序之一使用SQLite来存储从服务器下载的数据。

应用程序本身使用多线程,以便在应用程序启动时,应用程序在后台下载数据,同时还向用户显示UI。

此时的用户可以开始浏览应用,点击表格行以深入了解详细信息页面。

有时当我点击表格行时,应用程序会在许多sqlite3_prepare_v2()函数调用中崩溃。当我允许NSOperationQueue超过1次最大并发操作时,它发生得更频繁。但是,由于我将最大并发操作数限制为1,所以发生的情况要少得多。

当我的应用程序启动时,我正在打开一个数据库连接,我将其保持打开状态,直到应用程序需要终止,然后我关闭连接。

以下是崩溃的示例行:

if(sqlite3_prepare_v2(objDatabase, [strGet cStringUsingEncoding:NSUTF8StringEncoding], -1, &stmtGet, NULL) == SQLITE_OK)
{
    ...
}

错误说EXEC_BAD_ACCESS

就像20个应用程序中的1个或30个应用程序中的1个一样,它会崩溃。这意味着我的SQL语句可以在99%的时间内工作。

之前有过这种事吗?

2 个答案:

答案 0 :(得分:3)

我有同样的问题。仔细检查所有对sqlite3_prepare_v2指令的调用,并确保为每个指令调用匹配的sqlite3_finalize。在我的情况下,我有一个没有调用sqlite3_finalize的位置,导致下次调用sqlite3_prepare_v2时发生崩溃。它并不总是崩溃,而且很难像疯了一样调试。我希望这条评论可以帮到你。

您可能真的很有帮助为sqlite3_prepare_v2和sqlite3_finalize编写存根函数,这些函数将这些操作记录到NSLog。这将有助于验证匹配的呼叫。

答案 1 :(得分:0)

启用僵尸对象并检查是否存在因释放对象而导致的任何问题,因为大多数时间执行错误访问是由于已释放的对象。通过启用僵尸,你会被告知为什么应用程序崩溃。这可能是你的内存管理不正确,在不同的线程中,有时候你的管理方法没有正确调用。

启用ns zombie对象

产品>编辑方案>启用僵尸并尝试立即崩溃应用程序