¿Qué es NSZombie?

He visto sugerencias que dicen que establecer NSZombieEnabled en true durante la depuración. ¿Qué es NSZombie? ¿Es un marco? ¿Un ajuste?

Es una ayuda de depuración de memoria. Específicamente, cuando configura NSZombieEnabled , cada vez que un objeto llega a retener el conteo 0, en lugar de desasignarse, se transforma en una instancia de NSZombie . Cada vez que un zombi recibe un mensaje, registra una advertencia en lugar de chocar o comportarse de una manera impredecible. Como tal, puede depurar problemas sutiles de liberación / liberación automática sin herramientas avanzadas o una aguja minuciosa en las búsquedas de pajar.

El nombre es una jugada bastante obvia en el hecho de que los objetos normalmente se consideran “muertos” cuando alcanzan el conteo de retención 0. Con este ajuste, continúan existiendo en una extraña vida media, ni vivos, ni completamente muertos. Al igual que los zombies reales, excepto que comen bastante menos cerebros.

Adam hizo un gran trabajo al explicar qué son los Zombies, pero usar la variable de entorno no es la mejor manera de encontrarlos y rastrearlos.

Un enfoque mucho mejor para la detección de zombis, es simplemente usar instrumentos: desde XCode, comienza con “Ejecutar con el instrumento” y elige “Asignaciones”.

A continuación, detenga la grabación justo después de que comience, presione el botón “i” en el instrumento Allocations y active “habilitar recuentos de referencia” y “Activar detección NSZombie”. Ahora, vuelva a presionar Grabar en el instrumento y la aplicación se iniciará. Si se envían objetos zombis, se detendrá la grabación y aparecerá un cuadro de diálogo en la línea de tiempo de la grabación. Puede hacer clic para encontrar el lugar donde se encontraba el objeto. retenido o liberado.

Editar: El consejo anterior fue para XCode 3, aquí hay una adición para XCode 4:

En XCode 4.2 , hay un mecanismo aún más fácil para hacer uso de la detección Zombie: el Zombie Instrument. En lugar de “Ejecutar” para iniciar la aplicación, use “Perfil” y aparecerá un selector de instrumento. Seleccione “Zombie” y la aplicación comenzará a funcionar. Haga lo que sea que provoque su caída, aparecerá un cuadro de diálogo que dirá “Zombie Messaged”.

Desde allí, haga clic en la flecha pequeña en el cuadro de diálogo. Eso llevará a una lista de todas las veces que el objeto zombie fue creado, retenido o liberado. Levante la barra lateral y puede ir a cada entrada, mirando el rastro de la stack para el código que fue responsable de cada ajuste en el conteo retenido.

Estoy de acuerdo con lo que agregó Kendall, es muy útil, pero sugeriré que sigas haciendo la variable de entorno para que no olvides que están habilitados. Al igual que el enlace (ahora caducado) en Cocoa Dev, puse esto para no perderlo:

 if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) { NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!"); } 

Me llama mucho la atención.