iphone - licencia - swift xcode
¿Cómo depurar el "mensaje enviado a la instancia desasignada" en Xcode4? (2)
Presioné ALT + CMD + R y activé NSZombieEnabled en Argumentos> Variables de entorno. Además, lo activé en Diagnósticos> Administración de memoria> Activar objetos zombi.
Sin embargo, cuando construí y ejecuté, en algún momento mi aplicación falla al darme este mensaje inútil en la consola:
*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260
El seguimiento de la pila es tan inútil. Moví el control deslizante de nivel de detalles hacia la derecha. El hilo 1 simplemente me muestra esto:
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 objeto muerto.
¿Hay alguna forma de averiguar qué CALayer está desasignado demasiado pronto?
Actualización: ¡Así que después de construir y ejecutar aproximadamente 100 veces más, de repente el problema desapareció! ¡Se ha ido por completo! Y la mejor parte: ¡no modifiqué mi código de ninguna manera! Entremedio, limpié la carpeta de compilación y proyecto con los comandos limpios varias veces y también borré la aplicación en el simulador varias veces.
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 de forma aleatoria.
Actualización 3: finalmente lo encontré por accidente:
startButton = newBttn;
debería haber sido:
self.startButton = newBttn;
startButton era una propiedad de retención y en -dealloc lo lancé. Así que se soltó mucho y en la mayoría (pero no en todos) los casos después de que la vista se desvaneciera, se bloqueó al dar ese extraño mensaje de retención de CALayer.
El Zombies Instrument (CMD + I) finalmente señaló que tenía que ver con un botón. Simplemente no sabía por qué y dónde.
Clang Static Analyzer no se quejó de este error obvio.
Además de la gran respuesta de Jeff; para hacer casi lo mismo, pero sin tener que abrir Instruments o crear un perfil de su aplicación, puede configurar NSZombieEnabled , MallocStackLogging y guardar malloc en el depurador. Luego, cuando su aplicación falla, tipea esto en la consola de gdb:
(gdb) info malloc-history 0x543216
Reemplace 0x543216
con la dirección del objeto que causó el bloqueo, obtendrá un seguimiento de pila mucho más útil y le ayudará a identificar la línea exacta en su código que está causando el problema.
Si esto vuelve a surgir, puedes ejecutar un instrumento Zombies dedicado. Pulse Comando + I para crear un perfil de la aplicación y seleccionar el instrumento Zombies (debe estar ejecutándose en el simulador). Si obtienes un zombie, puedes mostrar todo el historial de memoria (cada retener / liberar) para ese objeto, lo cual es inmensamente útil para rastrear errores.