当推送一个新的控制器时,pushViewController 是不是应该释放 oldController?
Posted
技术标签:
【中文标题】当推送一个新的控制器时,pushViewController 是不是应该释放 oldController?【英文标题】:Should pushViewController release oldController when a new one is pushed?当推送一个新的控制器时,pushViewController 是否应该释放 oldController? 【发布时间】:2011-04-28 08:02:40 【问题描述】:据我了解pushViewController
应该在推送新的viewController
时释放旧的viewController
?
这里我只是创建了两个不同的viewControllers
并推送它们。
UINavigationController *navController = [[UINavigationController alloc] init];
[self.window addSubview:navController.view];
smallLayout = [[SmallViewController alloc] init];
[navController pushViewController:smallLayout animated: NO];
[smallLayout release];
largeLayout = [[LargeViewController alloc] init];
[navController pushViewController:largeLayout animated: NO];
[largeLayout release];
在SmallViewController
中,dealloc 永远不会被调用,当我检查保留计数时它仍然是 1。我在运行循环完成后很长时间检查保留计数,我也知道保留计数不是你的东西应该信任。
【问题讨论】:
【参考方案1】:不应该……
导航控制器维护着所有推送到它的视图控制器的导航堆栈...所以当您返回或弹出当前视图控制器时,前一个控制器仍然存在。
导航控制器弹出后会释放一个视图控制器。
【讨论】:
【参考方案2】:当您将新控制器推送到导航堆栈时,视图控制器不会被释放。导航控制器会一直抓住它们,以便在您将当前控制器从其中弹出时显示正确的项目。如果它正在释放它,那么导航控制器将没有任何东西可以返回。
如果您希望尝试优化内存,请实现 -(void)viewDidUnload。它会在控制器的视图被卸载时调用,这可能在您推送新控制器时发生。我说可能会发生,因为它是在内存不足的情况下调用的。因此,如果您有足够的可用内存,它将不会被调用。在模拟器中,您可以通过模拟内存警告来强制它。确保您在其中销毁的任何内容都可以并且正在 -viewDidLoad 中重新创建。
【讨论】:
【参考方案3】:你分配一次,你释放一次。你已经在你的代码中这样做了。所以AFAIK你的代码很好。这里 smallLayout 的dealloc
不会被调用,因为UINavigationController
保留了所有视图控制器的堆栈,因此保留了它。 UINavigationController
管理这些 viewController 在不再需要时的发布。
【讨论】:
以上是关于当推送一个新的控制器时,pushViewController 是不是应该释放 oldController?的主要内容,如果未能解决你的问题,请参考以下文章