¿Qué es NSZombie?

97

He visto que dicen sugerencias para establecer NSZombieEnabledque truedurante la depuración. ¿Qué es NSZombie? ¿Es un marco? ¿Un ajuste?

Moshe
fuente
18
Un NSObject no muerto - ¡cuidado!
vikingosegundo
5
Un * NSObject no muerto.
Alex Zavatone

Respuestas:

191

Es una ayuda para depurar la memoria. Específicamente, cuando establece NSZombieEnabledentonces, cuando un objeto alcanza el valor de retención 0, en lugar de ser desasignado, se transforma en una NSZombieinstancia. Cada vez que un zombi recibe un mensaje, registra una advertencia en lugar de bloquearse o comportarse de manera impredecible. Como tal, puede depurar problemas sutiles de liberación excesiva / liberación automática sin herramientas avanzadas o agujas minuciosas en las búsquedas en el pajar.

El nombre es un juego bastante obvio con el hecho de que los objetos normalmente se consideran "muertos" cuando alcanzan el recuento de retención 0. Con esta configuración, continúan existiendo en una extraña vida media: ni vivos ni del todo muertos. Al igual que los zombis reales, excepto que comen menos cerebros.

Adam Wright
fuente
61
Tenga cuidado de eliminar esta configuración cuando haya terminado de depurar porque esencialmente filtra todos los objetos.
Justin
1
Gracias por esta sencilla explicación. Infórmele que Cocoa Dev Link ya no funciona. +1 para abreviar y al grano.
CRDave
95

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

Un enfoque mucho mejor para la detección de zombies es simplemente usar Instrumentos - desde XCode comience con "Ejecutar con Instrumento" y elija "Asignaciones".

Luego, detenga la grabación justo después de que comience, presione el botón "i" en el instrumento de asignaciones y active "habilitar recuentos de referencia" y "habilitar NSZombie Detection". Ahora presione Grabar nuevamente en el instrumento, y su aplicación se iniciará; si se envía algún objeto zombie, la grabación se detendrá y aparecerá un cuadro de diálogo en la línea de tiempo de grabación; puede hacer clic en él para encontrar cada lugar donde se encontraba un objeto retenido o liberado.

Editar: El consejo anterior era 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 de zombies: el instrumento Zombie. En lugar de "Ejecutar" para iniciar la aplicación, use "Perfil" y aparecerá un selector de instrumentos. Seleccione "Zombie" y la aplicación comenzará a ejecutarse; haga lo que sea que cause el bloqueo, aparecerá un cuadro de diálogo que dice "Mensaje de Zombie".

Desde allí, haga clic en la flecha pequeña del cuadro de diálogo. Eso llevará a una lista de todas las veces que se creó, retuvo o lanzó ese objeto zombie. Tire hacia arriba de la barra lateral y puede ir a cada entrada, mirando el seguimiento de la pila para el código que fue responsable de cada ajuste en el recuento de retención.

Kendall Helmstetter Gelner
fuente
2
Este es un consejo increíblemente útil.
w.donahue
4
Actualicé la respuesta para XCode 4, ya que facilita aún más la detección de zombis en Instrumentos.
Kendall Helmstetter Gelner
No realmente, debería funcionar más o menos igual con XCode 5 y 6.
Kendall Helmstetter Gelner
2
También puedo confirmar que con XCode 7.2
Batir el
31

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 habilitadas. Similar al enlace (ahora vencido) en Cocoa Dev, puse esto para que no me lo pierda:

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

Me llama la atención muy bien.

Matthew Frederick
fuente