¿Cómo depurar el "post enviado a la instancia desasignada" en Xcode4?

Presioné ALT + CMD + R y activé NSZombieEnabled en Argumentos> Variables de entorno. Además, lo activé en Diagnóstico> Gestión de memory> Activar objects zombi.

Sin embargo, cuando construí y ejecuté, en algún momento mi aplicación se bloquea y me da este post inútil en la console:

*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260 

La traza de la stack es tan inútil. Moví el slider de nivel de detalles todo el path a la derecha. El subprocess 1 simplemente me muestra esto:

captura de pantalla

Todo es propiedad del sistema y no hay una sola línea relacionada con mi aplicación. Así que obviamente NSZombiesEnabled no funciona como lo hizo en Xcode 3, donde se detuvo en el object muerto.

¿Hay alguna manera de descubrir qué CALayer se desasigna demasiado pronto?

Actualización: Entonces, después de build y ejecutar alnetworkingedor de 100 veces más, el problema desapareció de repente. ¡Se ha ido por completo! Y la mejor parte: ¡no modifiqué mi código de ninguna manera! En medio limpio la carpeta de construcción y proyecto con los commands de limpieza varias veces y eliminé la aplicación en el simulador varias veces también.

Actualización 2: afortunadamente, el problema volvió a aparecer. Y ahora parece persistente. Afortunadamente, porque prefiero encontrar la causa raíz en lugar de molestar a los usuarios por azar.

Actualización 3: Finalmente la encontré por crash:

 startButton = newBttn; 

debería haber sido:

 self.startButton = newBttn; 

startButton era una propiedad de retención y en -dealloc lo liberé. Por lo tanto, se liberó y en la mayoría de los casos (pero no todos) después de que la vista se desvaneció, se estrelló con ese extraño post de CALayer retainCount.

El instrumento Zombies (CMD + I) finalmente señaló que tenía que ver con un button. Simplemente no sabía por qué y dónde.

Clang Static Analyzer no se quejó de este problema técnico obvio.

Si esto vuelve a aparecer, puedes ejecutar un instrumento dedicado de Zombies. Pulsa Comando + I para perfilar la aplicación y selecciona el instrumento Zombies (debes estar ejecutando en el simulador). Si obtiene un zombie, puede mostrar todo el historial de memory (cada retención / liberación) para ese object, que es inmensamente útil para rastrear errores.

Además de la gran respuesta de Jeff; para hacer casi lo mismo, pero sin tener que abrir Instrumentos o perfilar su aplicación, puede configurar NSZombieEnabled , MallocStackLogging y save malloc en el depurador. Entonces, cuando su aplicación se bloquea, escriba esto en la console gdb:

 (gdb) info malloc-history 0x543216 

Reemplace 0x543216 con la dirección del object que causó el locking, y obtendrá un rastreo de stack mucho más útil y debería ayudarlo a identificar la línea exacta en su código que está causando el problema.

Este artículo tiene información adicional.