3

我正在构建的一个应用程序使用 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% 的时间里都有效。

以前有人遇到过这种情况吗?

4

2 回答 2

3

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

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

于 2012-07-03T19:32:42.790 回答
0

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

启用 ns 僵尸对象

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

于 2012-05-03T09:02:36.830 回答