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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top