Ok, aquí está el trato, odio hacer preguntas sobre mi depuración y fallas. Porque normalmente los manejo yo mismo, pero simplemente no puedo evitar esto, incluso después de ver varias preguntas .
Ok, aquí está el problema, encuentro que mi aplicación se bloquea y se bloquea aleatoriamente con este seguimiento de pila:
*** -[ViewController respondsToSelector:]: message sent to deallocated instance 0x1e5d2ef0
Donde ViewController
puede variar, a veces el lugar donde mi código falla, NO tiene relevancia para ese particular ViewController
y no lo posee ni lo llama.
Además, para obtener ese seguimiento de la consola, habilité Zombies, de lo contrario no obtendría ninguna impresión de la consola, solo obtendría:, objc_msgSend
lo que sé que significa que estoy enviando un mensaje de algo que se publica. Pero no puedo encontrar dónde está ... ¡Estoy realmente atascado! Por lo general, siempre depuro mis bloqueos, por lo que estoy realmente atascado en esto.
Nuevamente, esto se bloquea en diferentes lugares en diferentes momentos, de forma intermitente. Y el lugar donde se estrella casi no tiene relevancia para el ViewController
. Y encuentro esto muy confuso.
¿Necesitas algo de mi código? Tengo muchos archivos y, dado que se bloquea en diferentes lugares, ¡distribuir mi código será un desastre!
Intenté agregar puntos de interrupción simbólicos sin suerte, y Zombies no está disponible en la aplicación Instrumentos para iOS. No puedo ejecutar mi aplicación en el simulador ya que tiene marcos de arquitectura no compatibles.
Gracias a todos...
fuente
Respuestas:
Utilice Instrumentos para rastrear errores de instancia desasignada. Perfile tu aplicación ( Cmd ⌘+ I) y elige la plantilla Zombies . Una vez que su aplicación se esté ejecutando, intente bloquearla. Deberías conseguir algo como eso:
Haga clic en la flecha junto a la dirección en la ventana emergente para mostrar el objeto al que se llamó después de que se desasignó.
Debería ver ahora cada llamada que ha cambiado y retener el recuento de este objeto. Esto podría deberse al envío directo de mensajes de retención / liberación, así como al drenaje de los grupos de liberación automática o la inserción en NSArrays.
La columna RefCt muestra retenerCount después de que se invocó la acción y el llamador responsable muestra el nombre de la clase y el método en el que se realizó. Cuando hace doble clic en cualquier retención / liberación, los instrumentos le mostrarán la línea de código donde se realizó (si esto no funciona, puede examinar la llamada seleccionándola y eligiendo su contraparte en el panel de detalles extendidos ):
Esto le permitirá examinar todo el ciclo de vida del objeto de retenciónCount y probablemente encontrará su problema de inmediato. Todo lo que tienes que hacer es encontrar el retenido que falta para la última versión .
fuente
release
, específicamente. El problema es que cualquier desequilibriorelease
. También puedo simplemente ser una falla enretain
algo a lo que estás manteniendo un puntero y haciendo referencia más tarde.tenía un problema similar. En mi caso, un viewController necesitaba obtener eventos de navigationController, por lo que se estaba registrando como el delegado del controlador de navegación:
El bloqueo ocurre cuando ese controlador fue desasignado pero aún era el delegado del controlador de vista. Agregar este código en dealloc no tuvo ningún efecto:
porque en el momento en que se llama a dealloc, el controlador de vista ya se ha eliminado de la jerarquía de vistas, por lo que self.navigationController es nulo, por lo que se garantiza que la comparación fallará. :-(
La solución fue agregar este código para detectar que el VC abandona la jerarquía de vista justo antes de que lo haga. Utiliza un método introducido en iOS 5 para determinar cuándo la vista se abre y no se empuja
¡No más choques!
fuente
Para cualquiera que no pueda resolverlo, aquí hay algunas otras técnicas:
https://stackoverflow.com/a/12264647/539149
https://stackoverflow.com/a/5698635/539149
https://stackoverflow.com/a/9359792/539149
https://stackoverflow.com/a/15270549/539149
https://stackoverflow.com/a/12098735/539149
Puede ejecutar Instrumentos en Xcode 5 haciendo clic en la ventana emergente del proyecto-> Editar esquema ... Perfil -> Instrumento y elija Asignaciones o Fugas, luego perfile su aplicación, luego detenga Instrumentos, haga clic en el botón de información en Asignaciones y "Habilitar Detección NSZombie" .
Sin embargo, para los mensajes que provienen directamente del subproceso com.apple.main, esto probablemente no revelará nada.
Me golpeé la cabeza con esto durante más de dos horas y la respuesta resultó ser un lanzamiento excesivo, que descubrí al comentar una copia de mi proyecto por fuerza bruta hasta que encontré al culpable:
El problema es que la versión no establece la variable en NULL.
Eso significa que al establecerlo en NULL, las llamadas se liberan nuevamente, disminuyendo el recuento de referencias y liberando la memoria inmediatamente hasta más tarde, cuando las variables que hacen referencia a viewController terminen con él.
Por lo tanto, habilite ARC o asegúrese de que su proyecto use consistentemente release o NULL pero no ambos. Mi preferencia es usar NULL porque entonces no hay posibilidad de hacer referencia a un zombi, pero hace que sea más difícil encontrar dónde se liberan los objetos.
fuente
Ayer me encontré con el mismo problema en iOS. He creado IAP en la subvista "Acerca de" de la aplicación, y he agregado Transaction Observer en "Acerca de" viewDidLoad. Cuando compro por primera vez, no hay problema, pero después de volver a la ventana principal e ingresar sobre la subvista para comprar nuevamente, se produjo el problema "mensaje enviado a la instancia desasignada" y la aplicación se bloqueó.
Después de eliminar Transaction Observer en dealloc, el problema está resuelto.
fuente
zombie
objeto para compras dentro de la aplicación. Después de muchas horas de excavación encontré este ... MUCHAS GRACIAS Hombre.Tuve un problema muy similar y descubrí que se debía a que los delegados del controlador de navegación estaban configurados.
Lo siguiente resolvió mi problema,
fuente
Tuve el mismo problema en OS X.
Para resolver este
- (void)dealloc
método no es suficiente como ya dijo @SoftwareEvolved. Pero, lamentablemente,- (void)viewWillDisappear
solo está disponible en la versión 10.10 y posteriores.Introduje un método personalizado en mi subclase NSViewController donde establecí todas las referencias peligrosas para zombis en nulo. En mi caso fueron
NSTableView
propiedades (delegate
ydataSource
).Eso es todo. Cada vez que estoy a punto de eliminar la vista de la supervista, necesito llamar a este método.
fuente
Tuve el mismo problema. Fue difícil encontrar qué delegado causa el problema, porque no indica ninguna línea o declaración de código, así que lo intenté de alguna manera, tal vez sea útil para usted.
fuente