¿Qué es NSZombie?

He visto sugerencias que dicen que establezca NSZombieEnabled en true mientras se NSZombieEnabled . ¿Qué es NSZombie? ¿Es un marco? ¿Un ajuste?

Es una ayuda de debugging de memory. Específicamente, cuando configura NSZombieEnabled , cada vez que un object alcanza, retiene el recuento 0, en lugar de desasignarse, se transforma en una instancia de NSZombie . Cada vez que un zombie recibe un post, registra una advertencia en lugar de estrellarse o comportarse de manera impnetworkingecible. Como tal, puede depurar sutiles problemas de liberación excesiva / autorelease sin herramientas avanzadas o agujas meticulosas en las búsquedas de pajar.

El nombre es un juego bastante obvio en el hecho de que los objects normalmente se consideran "muertos" cuando alcanzan retener el conteo 0. Con esta configuration, continúan existiendo en una extraña vida media, ni vivos ni muertos. Al igual que los zombies reales, excepto que comen less cerebros.

Adam hizo un gran trabajo explicando lo que 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 utilizar Instrumentos: desde XCode comience con "Ejecutar con Instrumento" y elija "Asignaciones".

Luego, detenga la grabación justo después de que comience, presione el button "i" en el instrumento de Asignaciones y active "habilitar los recuentos de reference" y "Habilitar la detección de NSZombie". Ahora pulsa Grabar nuevamente en el instrumento y tu aplicación se activará; si se envían objects zombis, se detiene la grabación de posts y aparecerá un cuadro de dialog en la línea de time de grabación; puedes hacer clic para encontrar cada lugar donde se encontraba un object 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 de zombis: el Instrumento Zombie. En lugar de "Ejecutar" para iniciar la aplicación, use "Perfil" y aparecerá un selector de instrumentos. Selecciona "Zombie" y la aplicación comenzará a ejecutarse; haz lo que sea que cause tu locking, aparecerá un cuadro de dialog que dice "Zombie Messaged".

Desde allí, click la flecha pequeña en el cuadro de dialog. Eso llevará a una list de todas las veces que se creó, conservó o lanzó el object zombie. Levante la barra lateral y puede ir a cada input, mirando el rastreo de stack para el código responsable de cada ajuste en el recuento de retención.

Estoy de acuerdo con lo que Kendall agregó, es muy útil, pero sugeriría seguir haciendo la variable de entorno para que no se olvide que están habilitados. Similar al enlace (ahora caducado) 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.