Problemas de la liberación de memoria cuando apareciendo un viewController utilizando un navigationController
-
29-09-2019 - |
Pregunta
Tengo el siguiente problema. Cuando me pop del controlador de vista presionando el botón de retroceso, el método dealloc no está recibiendo llamadas.
Aquí está el código que estoy usando:
NSLog(@"coleccionVista retain count0: %i",[coleccionVista retainCount]);
coleccionVista = [[coleccionViewController alloc] init];
NSString *nombreColeccion = [colecciones objectAtIndex:i];
coleccionVista.nombreColeccion = nombreColeccion;
coleccionVista.title = [NSString stringWithFormat:coleccionVista.nombreColeccion];
NSLog(@"coleccionVista retain count1: %i",[coleccionVista retainCount]);
[self.navigationController pushViewController:coleccionVista animated:NO];
NSLog(@"coleccionVista retain count2: %i",[coleccionVista retainCount]);
[coleccionVista release];
//[coleccionVista release];
NSLog(@"coleccionVista retain count3: %i",[coleccionVista retainCount]);
Y estoy a recibir estos mensajes en la consola:
La primera vez que empujo la vista:
2010-08-17 10:30:36.019 TAU 4[50133:207] coleccionVista retain count0: 0
2010-08-17 10:30:36.021 TAU 4[50133:207] coleccionVista retain count1: 1
2010-08-17 10:30:36.022 TAU 4[50133:207] coleccionVista retain count2: 3
2010-08-17 10:30:36.022 TAU 4[50133:207] coleccionVista retain count3: 2
2010-08-17 10:30:36.088 TAU 4[50133:207] coleccionViewController->viewWillAppear
2010-08-17 10:30:38.515 TAU 4[50133:207] coleccionViewController->viewWillDisappear
La segunda vez:
2010-08-17 10:30:44.171 TAU 4[50133:207] coleccionVista retain count0: 1
2010-08-17 10:30:44.173 TAU 4[50133:207] coleccionVista retain count1: 1
2010-08-17 10:30:44.174 TAU 4[50133:207] coleccionVista retain count2: 3
2010-08-17 10:30:44.176 TAU 4[50133:207] coleccionVista retain count3: 2
2010-08-17 10:30:44.241 TAU 4[50133:207] coleccionViewController->viewWillAppear
2010-08-17 10:30:52.332 TAU 4[50133:207] coleccionViewController->viewWillDisappear
También tengo un mensaje NSLog en el método dealloc que no está mostrando. Pero me he dado cuenta de que si fuerzo otra [la liberación coleccionVista] tras otro el mensaje dealloc se mostró pero estrellarse cuando se trata de [dealloc súper]. No estoy sosteniendo cualquier otra referencia de coleccionViewController (He estado buscando en el código y todos los usos del método están en el código que estoy mostrando a usted).
¿Alguna idea? Gracias de antemano!
Solución
Conviene por último garantizar creo que me di cuenta de lo que pasó. He cambiado mucho código, así que no estoy seguro de ello, pero parece que era un NSTimer que estaba usando un método de la clase coleccionVista, por lo que se mantiene una referencia de la clase por lo que era imposible desasignar él.
Otros consejos
Dos grandes problemas:
NSLog(@"coleccionVista retain count0: %i",[coleccionVista retainCount]);
coleccionVista = [[coleccionViewController alloc] init];
Es de suponer que coleccionVista
podría ser no nula, pero no se expulsándolo antes de assgning una nueva. Este puede ser una fuga o un accidente. También tenga en cuenta que los rendimientos -retainCount NSUInteger, no int; formatearlo con% i invoca un comportamiento no definido (normalmente esto se acaba de imprimir el número equivocado en sistemas big-endian de 64 bits).
[coleccionVista release];
NSLog(@"coleccionVista retain count3: %i",[coleccionVista retainCount]);
Usted está liberando algo. Ya no lo posee. No es seguro para usarlo a menos que sabe que algo más es el dueño. Es probable que desee, ya sea [coleccionVista release]; coleccionVista = nil;
o simplemente self.coleccionVista = nil
si usted lo ha hecho una propiedad.