Te recomiendo que si eres nuevo en objective-c o no tienes claro el manejo de memoria, leas el Capítulo I: Objective-C. Lección 5: Manejo de Memoria.

A los que habíamos programado en otros lenguajes como c o c++, java, etc., al llegar a Objective-C es traumante encontrarse con este error y no saber por qué carajos sucede, bueno, sucede generalmente porque liberaste (release) algo que no deberías o antes de que deberías, o no lo liberaste, o sea algún retain de más o de menos.

Cuando tienes algún error de este tipo el programa terminará y el xcode te mandará un mensaje que dice algo como:

Program received signal:  “EXC_BAD_ACCESS”.

Pero para saber dónde está el error, es dificil si tienes códigos muy grandes, para eso existe una cosa llamada NSZombie, no, no se trata de Residen Evil, ni tu programa te comerá los sesos, significa que los objetos que han sido liberados (su retain count ha llegado a 0) se conserva una copia vacía, que se le llama zombie, cuando el código llama al zombie, este te advertirá que estas llamando a una instancia que ya ha sido liberada.

¿Cómo habilito los objetos NSZombie?

Abre el proyecto en el que quieres habilitar los zombies, y ubicate sobre el ejecutable del proyecto, abre el menú contextual y selecciona Get Info, luego Ve a la pestaña de Arguments, agrega en el fondo la variable NSZombieEnabled y pon el valor en YES

Get info

1. Abre get Info

2. Argumentos

3. Agrega NSZombieEnabled

Ahora corremos de nuevo el programa, solo que ahora, cuando el programa se interrumpa, no terminará, sino que se pausa, y podemos ver que manda un mensaje como el siguiente:

2011-01-27 20:11:40.434 backer[20102:810b] *** -[UISearchBar respondsToSelector:]: message sent to deallocated instance 0x661e850

Ahora lanzamos el debugger ve al Menú Run -] Debugger:

Pila de llamadas

En negro se muestran los métodos que están en tu código, en gris se encuentran las llamadas a métodos que se encuentran en alguna libería, entonces examinando los metodos en negro, puedes rastrear en donde estubo el objeto que liberaste más veces de las que deberías.

No olvides desactivar el zombie una vez que hayas terminado tu debug!

Saludos!