Eliminar controlleres de la stack UINavigationController

No puedo entender por qué FirsViewController no se destruye / lanzó en este escenario.

My AppDelegate.m – FirstViewController se presiona en la stack

self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]]; self.navigationController = [[UINavigationController alloc]init]; self.FirstViewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:[NSBundle mainBundle]]; [self.navigationController FirstViewController animated:YES]; 

FirstViewController.m

  self.SecondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]]; self.SecondViewController.totalNumberOfPlayers = self.selectedRow; [self.navigationController pushFadeViewController:self.SecondViewController]; [self.view removeFromSuperview]; -(void)dealloc { [SecondViewController release]; NSLog(@"SecondViewController released"); } 

Cuando ejecuto la aplicación y cambio del primer controller de vista no hay input NSLog en la console. Esto me hace pensar que el primer controller de vista no se destruye y la memory no se libera.

Parece que [self.view removeFromSuperview] no funciona bien en esta situación.

Mi pregunta es cómo liberar / destruir el FirstController. Nunca se usará en el rest de la aplicación.

Está correcto que los controlleres de vista en la stack no se liberen / destruyan. Esto no es un error, es por layout, ya que si hace estallar su controller de vista actual, deberá mostrar nuevamente el subyacente. La aplicación no sabe que nunca pretendes hacer eso.

Tu [self.view removeFromSuperview] no funciona porque elimina la vista de la window (que ya se ha eliminado de todos modos cuando presionó su segundo controller de vista), no el controller de vista de la stack (creo que puede estar confundiendo sus vistas y sus controlleres de vista).

Si desea deshacerse del primer controller de vista, al presionar su segundo controller de vista, en lugar de llamar:

 [navigationController pushViewController:secondViewController animated:YES]; 

Llama a esto:

 [navigationController setViewControllers:[NSArray arrayWithObject:secondViewController] animated:YES]; 

Eso replaceá por completo al primer controller de vista en lugar de simplemente empujar el nuevo controller encima. La animation será la misma.

Tenga en count que el controller de la primera vista se liberará inmediatamente cuando llame al método anterior, así que no intente hacer nada con el primer controller de vista después de llamar a esto o existe una buena probabilidad de que se bloquee.

Actualizar:

A continuación, se describe cómo debe verse el código de configuration de la delegación de la aplicación:

 self.window = [[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; self.navigationController = [[[UINavigationController alloc] init] autorelease]; FirstViewController *firstViewController = [[FirstViewController alloc] init]; [self.navigationController pushViewController:firstViewController animated:YES]; [firstViewController release]; 

Cosas a tener en count:

  1. No almacene el primer ViewController en una propiedad, o no se liberará cuando se muestre y displace todavía no se llamará (puede eliminar la propiedad firstViewController).

  2. Use minúsculas para nombres de variable, solo escribe en mayúsculas los nombres de las classs.

  3. Libere o autorice siempre los objects que asigna / init en el mismo método en el que los crea, esto evitará las advertencias del Analizador (y evitará las filtraciones).

  4. No necesita especificar el file nib si el nombre del file nib coincide con el nombre de class del controller de vista.

Mella