从UINavigationController堆栈中删除控制器

时间:2012-02-09 09:59:25

标签: objective-c ios

我无法弄清楚为什么在这种情况下不会销毁/释放FirsViewController。

我的AppDelegate.m - FirstViewController被推入堆栈

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");
}

当我运行应用程序并从第一个视图控制器切换到第二个视图控制器时,控制台中没有NSLog输入。这让我觉得第一个视图控制器没有被破坏,并且没有释放它的内存。

似乎[self.view removeFromSuperview]在这种情况下效果不佳。

我的问题是如何释放/销毁FirstController?它将永远不会在应用程序的其余部分使用。

1 个答案:

答案 0 :(得分:16)

您是正确的,堆栈中的视图控制器不会被释放/销毁。这不是一个错误 - 它是设计的,因为如果你弹出当前的视图控制器,它将需要再次显示底层控制器。该应用程序并不知道您从未打算这样做。

你的[self.view removeFromSuperview]不起作用,因为它从窗口中删除了视图(当你按下第二个视图控制器时已经被删除了)而不是视图控制器从堆栈中删除(我想你可能是混淆你的观点和视图控制器。)

如果你想摆脱第一个视图控制器,当你推动你的第二个视图控制器时,而不是调用:

[navigationController pushViewController:secondViewController animated:YES];

请改为:

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

这将完全取代第一个视图控制器,而不是仅仅在它上面推动新的视图控制器。动画将是相同的。

请注意,当您调用上述方法时,第一个视图控制器将立即释放,因此在调用此方法后不要尝试对第一个视图控制器执行任何操作,否则它很可能会崩溃。

更新

以下是您的应用委托设置代码的外观:

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];

注意事项:

  1. 不要将firstViewController存储在属性中,或者在弹出时不会释放它,并且仍然不会调用dealloc(你可以删除firstViewController)属性。

  2. 对变量名使用小写,仅大写类名

  3. 始终以您创建它们的相同方法释放或自动释放您分配/初始化的对象 - 这将避免分析器警告(并避免泄漏)。

  4. 如果nib文件名与视图控制器类名匹配,则无需指定nib文件。

  5. 尼克