waze señal problemas problema hay con calibrar buscando cocoa-touch

cocoa touch - señal - Desarrollo de iPhone-error EXC_BAD_ACCESS sin rastrear la pila



sin señal gps iphone 6 (6)

La causa más común de este error es cuando suelta un objeto y algún otro mecanismo intenta acceder / liberar / desasignarlo más tarde.

Cada vez que recibo un informe de un error EXC_BAD_ACCESS , mi primera recomendación es recorrer el código para determinar qué línea lo está causando, y luego buscar cualquier llamada explícita [object release] que haga referencia a ese objeto. Coméntelos uno por uno para descubrir dónde se equivocó (y, por supuesto, asegúrese de que el objeto se publique correctamente más adelante).

Si la línea no le ayuda a descubrir qué objeto (s) está causando el problema, comience a mirar a través de sus llamadas [object release] y asegúrese de no soltar objetos demasiadas veces por accidente o de soltar objetos. usted no es dueño.

Esto conduce a una buena guía general con respecto a la release en Objective-C:

Si posee un objeto (asignarlo o retenerlo), lo suelta. Si no es el propietario (vino a través de un método de conveniencia o alguien más lo asignó), no lo libera.

(A través de Memory Management con Objective C / Cocoa / iPhone , que también tiene algunos buenos consejos).

Aquí está mi caso: tengo una vista de tabla que muestra contactos. El botón Agregar en la barra de navegación se usa para cargar otra vista para la entrada de datos. Esta nueva vista tiene imágenes en el encabezado de la tabla, y cada celda de la tabla tiene un UITextField o un UITextView . Cuando presiono Cancelar, la vista se abre y se libera la memoria.

Aquí está mi problema: cuando abro la interfaz "Agregar", proporciono un valor en cualquiera de los UITextField o UITextView, y presiono "Cancelar" para volver a la vista principal, obtengo un error de EXC_BAD_ACCESS . Cuando lo rastrear, el "Agregar controlador" llama a dealloc correctamente, pero después del [super dealloc] cuando presiono Continuar, arroja este error. Solo esto, no hay rastros, aunque estoy usando NSZombieEnabled. Cuando ejecuto el código con Instruments, no obtengo ningún error :(

Espero ser claro al explicar el problema. ¿Alguna sugerencia? Gracias.


La regla general es que cualquier cosa que crees, debes administrarla (retenerla / liberarla). Cualquier cosa que salga de un NIB, generalmente no se debe liberar en el código.


Coloque el [super dealloc] como el último enunciado del método de clase dealloc. Obtendrás este comportamiento cuando trates a la súper clase primero.


Aunque esto suele ser el resultado de una memoria mal administrada, puede suceder por otras razones (y será más difícil de depurar que simplemente activar NSZombieEnabled ). Por ejemplo, si no proporciona la cantidad correcta de argumentos a una cadena de formato (es decir, mientras NSLog otro problema con NSLog ), podría terminar sin rastro de pila incluso con todos los argumentos de depuración habilitados. Afortunadamente, puede usar GDB dentro de Xcode para restaurar el trazado de la pila a un estado anterior .

En la consola de GDB debería ver las instrucciones que bloquearon su programa. Ubique la última instrucción de devolución exitosa antes de la que falló. Debería verse algo como esto:

je 0x986cef35 <objc_msgSend+117>

Tenga en cuenta el valor hexadecimal y ejecute lo siguiente en GDB:

set $eip = 0x986cef35 stepi where

Deberías (con suerte) tener un seguimiento de pila más informativo ahora.

Fuente (igual que el enlace de arriba)


Las afirmaciones anteriores de que no deberías liberar objetos NIB son contradichas por Apple: mira aquí , donde dice que los objetos para los que tienes una salida deben ser liberados en dealloc, y también que debes asegurarte de establecer la referencia del objeto en nil luego .

Descargo de responsabilidad: soy un novato en programación de iPhone, aunque he estado programando durante mucho tiempo.


La respuesta de Cameron Spickert está un poco obsoleta, ya que Xcode usa lldb ahora en lugar de gdb. El enlace al artículo fuente también está muerto.

Lo mismo se puede hacer simplemente con el siguiente comando lldb:

(lldb) thread backtrace

Esto mostrará el bt para el hilo actual. Si desea cambiar el hilo del cual desea obtener el bt, seleccione el marco y obténgalo así:

(lldb) thread list (lldb) thread select 2 (lldb) thread backtrace

Si desea replicar el comportamiento exacto de la respuesta de Cameron Spickert, use los siguientes comandos:

(lldb) expr unsigned int $eip = 0x1979c81d4 (lldb) stepi (lldb) thread backtrace

Fuente 1

Fuente 2