Pasé algún tiempo depurando un problema extraño con ARC y las funciones de destracking personalizadas.Problema de depuración de Xcode y ARC (omisión de dealloc)
- estoy subclases
NSOperation
clase - I conjunto de bloques de terminación para esta operación
- La operación es referenciado por una fuerte característica de muy objeto plano (no hay métodos, ivars automáticos, dos propiedades fuertes) llamemos a este objeto
DataRequest
- siguiendo todas las pautas el bloque de finalización utiliza solo referencias débiles a objetos locales (incluida la operación en sí)
- ni compilador ni analizador ge nerar cualquier problema
DataRequest
contiene la ÚNICA referencia a la operación que genero y se destruye en el bloque de finalización de la operación. Ha destruido SIEMPRE (sudealloc
siempre ejecutado)- Mi operación tiene una costumbre
dealloc
. Solo tengo una sola llamada NSLog.
... y la cuestión es:
Si me quedo en virtud de este depurador, el punto de interrupción en el dealloc no es golpeado, nunca aparece el mensaje de registro. Principalmente, pensé que la operación estaba goteando.
Si ejecuto esto en instrumentos, todo está bien, la consola del sistema imprime el mensaje y el instrumento Allocations informa que la operación se liberó de la instantánea de la pila adecuada, incluido el destracking personalizado. No se detectaron fugas.
estoy 100% seguro de que utilizar la misma configuración del compilador para la depuración y para el perfilado.
Lo más confuso al final: si creo una versión personalizada de [DataRequest dealloc]
y le pongo self.operation = nil;
, todo funciona bien incluso desde el depurador.
¿Alguien tiene algunas pistas sobre qué opciones de engarce del compilador para ver la diferencia? puede ser un error en las herramientas de Apple (todos nosotros estábamos en la posición de culpar a un gran pez por nuestros propios errores, ¿verdad?)
... y sí lo he intentado con GDB y LLDB. El resultado fue el mismo, lo que podría indicar algo.
He tratado de crear una muestra minimalista pero sólo funcionó (de hecho);)
Gracias
He hecho una observación muy básica ... si ejecuto la aplicación en el simulador de XCode (GDB o LLDB) mis mensajes de registro en 'dealloc' no se imprimen. Si dejo el depurador y lanzo la aplicación directamente desde el simulador, Console.app muestra todos los mensajes. No hay compilación sin enlaces intermedios. Extraño. – simpleone
... y un resultado aún más sencillo ... Si ejecuto la aplicación desde XCode en una sesión de depuración - dealloc no se llama (registro no impreso) si ejecuto la aplicación manualmente en el simulador y luego adjunto el depurador ... .todo es como se esperaba – simpleone