2010-08-24 15 views
11

estoy luchando para averiguar si pushViewController retiene el controlador, actualmente Tengo el siguiente código (que funciona) ...¿PushController retiene el controlador?

ColorController *colorController = [[ColorController alloc] initWithNibName:nibColor bundle:nil]; 
[[self navigationController] pushViewController:colorController animated:YES]; 
[colorController release]; 

pero estoy considerando la eliminación de la liberación y la adición de un autorelease ...

ColorController *colorController = [[[ColorController alloc] initWithNibName:nibColor bundle:nil] autorelease]; 
[[self navigationController] pushViewController:colorController animated:YES]; 

muy apreciada

Gary

+0

Usaría 'release' aquí ya que sabes que has terminado con' colorController' y 'UINavigationController # pushViewController: animated' retiene' colorController'. Pero, 'autorelease' también funciona. – ma11hew28

Respuesta

11

Esto no hace nada ...

ColorController *colorController = [[ColorController alloc] initWithNibName:nibColor bundle:nil]; 
[[[self navigationController] pushViewController:colorController animated:YES] autorelease]; 

Está liberando automáticamente el valor de retorno de pushViewController: animated :, que es nulo.

Su primer fragmento es válido y correcto. pushViewController: retiene el controlador que se empuja.

Editar: En su código actualizado, hay poca diferencia entre las dos muestras. Ambos mantienen recuentos de retención adecuados. Sin embargo, es una "mejor práctica" evitar usar AutoRelease a menos que sea necesario (especialmente en un área sensible a la memoria, como el iPhone). Esto ayuda a su aplicación a mantener una huella de memoria más predecible y manejable.

+0

Gracias, lo siento nuevamente por dejar caer el autorrelease en la línea incorrecta. Justo lo que buscaba. – fuzzygoat

+0

Typos suceder, solo quería asegurarse de que no fue intencional! jaja. –

+0

También es una buena práctica preferir la liberación automática para evitar errores de codificación. ¿Cuál eliges? Bueno, si los instrumentos le dicen que la liberación automática está ocupando una cantidad significativa de CPU o memoria, entonces seguro que puede usar llamadas de liberación explícitas. Pero esto es muy poco probable. –

0

Seguro que sí. Cada vez que entregue un objeto a otro objeto SDK como este, se conservará. Aunque esa segunda línea no está autorrealizando lo que piensas. Por lo general, desea autorelease en la misma línea que init para mayor claridad.

ColorController *colorController = [[[ColorController alloc] initWithNibName:nibColor bundle:nil] autorelease]; 
[[self navigationController] pushViewController:colorController animated:YES]; 
4

Sí, se mantiene el controlador de vista.

No hay una gran diferencia entre los dos bloques de código que publicó (al menos la versión que estoy viendo - otras personas probablemente vieron una versión anterior con una llamada perdida al autorelease). Puedes usar cualquiera de los dos. Es una cuestión de estilo.

+0

Gracias Shaggy Frog, muy apreciada. – fuzzygoat

0

Si desee probar, deberías probar este

id temp = [self.navigationController.viewControllers objectAtIndex:1]; 
[self.navigationController popToViewController:temp animated:YES]; 

usted puede navegar a cualquier otra ViewController anterior que están disponibles en la pila.

Cuestiones relacionadas