当我从另一个UIViewController按下按钮时,我正在显示UIControllerView子类:
- (IBAction)openNextLevelViewController
{
NSLog(@"openNextlevelViewController");
[self.navigationController pushViewController:nextLevelViewController animated:YES];
}
应用程序将在按钮按下时从该视图返回,触发此方法:
-(IBAction) returnToStart {
NSLog(@"returnToStart method called");
[self.navigationController popViewControllerAnimated:YES];
}
问题是显示的视图没有在pop上被破坏/解除分配。因此,当它被推送时,它不会执行viewDidLoad,这会启动一些变量。这可能导致相关问题,其中,第二次,当用户按下返回按钮时,“弹出”不再导致返回到先前的控制器。
处理这个问题的最佳方法是什么?我可以将初始化代码移动到“willAppear”方法,但似乎几乎可以随机调用。
答案 0 :(得分:2)
好吧,它没有被释放,因为nextLevelViewController仍然被保留在其他地方。最有可能在你的nextLevelViewController变量中。
- (IBAction)openNextLevelViewController
{
NSLog(@"openNextlevelViewController");
// assuming you have nib already set up
UIViewController *nextLevelViewController = [[NextLevelViewController alloc] init];
// RETAIN COUNT = 1
// navigationController retains your controller
[self.navigationController pushViewController:nextLevelViewController animated:YES];
// RETAIN COUNT = 2
// Don't need it any more let navigation controller handle it.
[nextLevelViewController release]
// RETAIN COUNT = 1 (by NavigationController)
}
进一步开始
-(IBAction) returnToStart {
[self.navigationController popViewControllerAnimated:YES];
// RETAIN COUNT = 0, dealloc will be called on your viewController, make sure to release all your retained objects.
}
现在当你的控制器被弹出时,它应该被释放(不应该被保留在其他任何地方)。下次调用openNExtLevelViewController时,无论如何都会初始化viewController的新实例。
我很喜欢在不再需要(显示)时释放viewController,而不是将其保存在内存中。让navigationController和TabBarController尽可能处理viewControllers。