我有一个应用程序,其中使用了两个UINavigationController——一个用于菜单系统,另一个用于实际游戏。在我的appDelegate中声明了一个常见的UINavigationController。当应用程序加载时,它会加载菜单或游戏的UINavigationController。当然,玩家可以在两者之间导航。
从菜单到游戏时,我创建一个新的UINavigationController,并按以下方式呈现:
GameViewController *rootController = [[GameViewController alloc] init];
UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:rootController];
[rootController release];
newNavController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:newNavController animated:YES];
[newNavController release];
然而,我注意到当我这样做时,菜单的视图控制器从未调用dealloc。可能是因为仍然有一个引用使其保持活动状态。我发现当我显式地将应用程序委托的UINavigationController设置为新的导航控制器(在释放新的navController之前),它会释放菜单。我按照以下方式执行此操作:
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.navController = newNavController;
[newNavController release];
这是一个好的实践吗?我发现当从游戏返回到菜单时,相同的技巧似乎不起作用。即
MainMenuViewController *menuViewController = [[MainMenuViewController alloc] init];
UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:menuViewController];
[menuViewController release];
newNavController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:newNavController animated:YES];
//Setting the appDelegate's navController to the new navController allows the menu to dealloc.
//This must happen AFTER the newNavController has been loaded.
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.navController = newNavController;
[newNavController release];
在游戏的主ViewController上永远不要调用dealloc方法。当我再次返回游戏时,菜单的主ViewController也不再被释放。
当我操纵UINavigationControllers时,我是否遗漏了什么?
谢谢,
Michael
编辑:我后来意识到我的游戏主ViewController没有dealloc的原因是我有一些NSTimers没有失效!然而,我仍然想知道我的上述方法是否正确,明确地在App Delegate中重新定义navController是否是允许不同的UINavigationControllers dealloc的正确方式 :)
self
的类是什么,这个对象在你的应用程序中扮演什么角色)? - jlehr