我有一个错误,一些用户EXC_BAD_ACCESS在他们的设备内存不足时有.堆栈跟踪指向if下面的行,我相信这是因为UTF8String被解除分配并仍在使用:
dispatch_sync(dbQueue, ^{
if (sqlite3_bind_text(sql_stmt, 1, pid.UTF8String, -1, SQLITE_STATIC) != SQLITE_OK) {
...
Run Code Online (Sandbox Code Playgroud)
我很难在我的脑海中重现这个问题,如何在模拟器或设备上强制或模拟低内存?
更新:
我已经尝试在上面的行中添加断点,然后使用选项模拟器 - >模拟内存警告,但我仍然无法重现EXC_BAD_ACCESS错误.
在模拟器的菜单中:硬件->模拟内存警告。
更新
如果您确定您的应用程序在 sqlite3_bind_text 处崩溃,我想最潜在的问题可能是 pid.UTF8String 有时为 NULL,在这种情况下会导致崩溃。另外, pid 或 pid.UTF8String 在使用时不太可能被释放,您可以检查崩溃报告(如果有)并检查导致 EXC_BAD_ACCESS 的内存地址,例如,如果您有EXC_BAD_ACCESS CODE=2 ADDRESS=0x00000000,这意味着 pid.UTF8String 确实是一个 NULL 指针,如果地址不是 0x0,那么,这是另一个问题(在你的情况下不太可能)。
作为建议,请在您的代码中添加 nil 检查:
if (pid) {
if (sqlite3_bind_text(sql_stmt, 1, pid.UTF8String, -1, SQLITE_STATIC) != SQLITE_OK){
// do your stuff
}
} else {
sqlite3_bind_null(sql_stmt,1);
}
Run Code Online (Sandbox Code Playgroud)