2011-04-28 55 views
1

从我的理解pushViewController应该释放旧的viewController当一个新的推动?pushViewController是否应该在推送新控件时释放oldController?

这里我只是创建了两个不同的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.我检查的保留计数运行循环完成后不久,我也知道,保留计数不你应该信任的东西。

回答

5

不,它不应该....

导航控制器保留所有视图控制器的导航堆栈被推到它...所以当你回去或弹出当前视图控制器,以前的控制器仍然存在。

导航控制器弹出后会释放视图控制器。

0

当您将新控制器推入导航堆栈时,视图控制器不会被释放。导航控制器保持不动,以便在您将当前控制器关闭时显示正确的项目。如果它释放它,那么导航控制器将没有任何东西可以返回。

如果您正在尝试优化内存,请实现 - (void)viewDidUnload。当你推动新的控制器时,控制器的视图被卸载,它会被调用。我说可能会发生,因为它在低内存条件下被调用。所以如果你有足够的空闲内存,它不会被调用。在模拟器中,您可以通过模拟内存警告来强制执行它。确保您在其中销毁的任何内容都可以在-viewDidLoad中重新创建。

0

你分配一次,你释放一次。您已经在您的代码中执行此操作。所以AFAIK你的代码是好的。这里的smallLayout的dealloc不会被调用,因为UINavigationController保留了所有viewController压入它的堆栈,因此保留它。 UINavigationController在不再需要时管理这些viewController的发布。

相关问题