La aplicación de iPhone SQLite prepara el bloqueo de la declaración

Una de las aplicaciones que estoy construyendo usa SQLite para almacenar datos que se descargaron de un servidor.

La aplicación en sí utiliza subprocesos múltiples, de modo que cuando se inicia la aplicación, la aplicación descarga datos en segundo plano mientras también presenta la interfaz de usuario al usuario.

El usuario en este momento puede comenzar a navegar por la aplicación, tocando las filas de la tabla para profundizar en las páginas de detalles.

A veces, cuando toco una fila de la tabla, la aplicación falla en una de las muchas llamadas a la función sqlite3_prepare_v2(). Ocurrió con mucha más frecuencia cuando permití más de 1 operación simultánea máxima para mi NSOperationQueue. Sin embargo, ha sucedido mucho menos ahora que he limitado el número máximo de operaciones concurrentes a 1.

Cuando se inicia mi aplicación, abro una conexión de base de datos y la mantengo abierta hasta que la aplicación deba terminar, luego cierro la conexión.

Aquí hay una línea de muestra en la que falla:

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

El error dice EXEC_BAD_ACCESS

Como 1 de cada 20 o 1 de cada 30 ejecuciones de aplicaciones, fallaría. Eso significa que mi instrucción SQL funciona el 99% del tiempo.

¿A alguien le ha pasado esto antes?

preguntado el 03 de mayo de 12 a las 08:05

¿Estás llamando a sqlite usando algún objeto? -

Bueno, tengo una sola instancia de la base de datos SQLite en mi delegado de aplicaciones patos para cubrirse, cada vez que quiera acceder a mi base de datos, haría algo como [[AppDelegate sharedDelegate].objLocalDal doSomething]; -

Entonces, ¿tiene una única conexión de base de datos que se comparte entre subprocesos (NSOperationQueues)? -

Toda la aplicación solo usa 1 conexión de base de datos. La única vez que se cierra la base de datos es cuando la aplicación llama al método appWillTerminate() en el archivo AppDelegate.m. -

2 Respuestas

Yo tuve el mísmo problema. Revise cuidadosamente todas las llamadas a las instrucciones sqlite3_prepare_v2 y asegúrese de que se llame al sqlite3_finalize correspondiente para cada una de ellas. En mi caso, tenía una ubicación en la que no se llamaba a sqlite3_finalize, lo que provocaba el bloqueo la próxima vez que se llamaba a sqlite3_prepare_v2. No siempre falla y es difícil de depurar como un loco. Espero que este comentario te pueda ayudar.

Puede que le resulte útil escribir funciones auxiliares para sqlite3_prepare_v2 y sqlite3_finalize que registran estas acciones en NSLog. Eso ayudará a verificar las llamadas coincidentes.

Respondido 05 Jul 12, 15:07

Bueno, de alguna manera logré que la aplicación funcionara y fuera aprobada por Apple. Usé palabras clave @synchronized, limpié gran parte de mi código y usé NSOperationQueue con ASIHttpRequest para descargar mis datos en lugar de usar un ciclo while para ejecutar una cola de descargas dudosa. El código ha dejado de fallar desde entonces. Me he pasado a usar Core Data para nuevos proyectos ahora, me ahorra muchos dolores de cabeza y tiempo. - Zhang

habilite los objetos zombis y verifique si hay algún problema debido al objeto liberado porque la mayoría de las veces el mal acceso del ejecutivo se debe a los objetos liberados. y al habilitar zombie, se le dirá por qué la aplicación se bloqueó. esto puede ser que su administración de memoria no sea adecuada en diferentes subprocesos, a veces su método de administración invoca correctamente otras veces no.

habilitar ns objetos zombie de

Producto>editar esquemas> habilitar zombie e intentar bloquear la aplicación ahora

contestado el 03 de mayo de 12 a las 10:05

He habilitado NSZombie. Lo único que obtuve en la consola fue "(lldb)" y "Subproceso 4: EXC_BAD_ACCESS (código = 2, dirección = 0x4) - Zhang

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.