当推送一个新的控制器时,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?的主要内容,如果未能解决你的问题,请参考以下文章

当我们尝试在切换后推送新的viewcontroller时,为什么tabbar控制器开关不工作

当我推送一个新的视图控制器时,自动布局高度发生变化

在推送新的视图控制器之前移除键盘

iOS点击推送通知打开具体的viewcontroller

从目标视图控制器推送新的视图控制器(swift)

推送新的 viewController 时,TabBar 总是向左移动