2012-02-10 46 views
0

下面是我如何移除永远不会在应用程序中再次使用的UIViewControllers。从堆栈中永久移除UIViewController

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: self.navigationController.viewControllers]; 
    [allViewControllers removeObjectAtIndex:0]; 
    [allViewControllers removeObjectAtIndex:1]; 
  1. 这是从堆栈中删除视图的正确方法?

  2. 使用Instruments运行应用程序时,我注意到应用程序进入执行上述代码的阶段时,内存不会被释放。这里有什么问题?

+0

您是否在使用ARC? – 2012-02-10 14:54:58

+0

我正在使用ARC功能。 – OhDoh 2012-02-10 14:59:11

+1

你是否删除了正确的索引?这实际上会删除0和2,而不考虑第一次删除后的重新排序。 – willcodejavaforfood 2012-02-10 14:59:47

回答

0

通过将您的视图控制器分配到一个新的可变数组中,您将其保留计数增加1,删除它们将其保留计数减1,以使净效应为零。你想要做的是在删除它们之后替换属于导航控制器的视图控制器,通过导航控制器释放你的旧实例。

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 
[allViewControllers removeObjectAtIndex:0]; 
[allViewControllers removeObjectAtIndex:1]; 

[self.navigationController setViewControllers:allViewControllers animated:YES]; 
+0

不,没有效果。内存堆的大小与使用或不使用您建议的代码相同。 – OhDoh 2012-02-10 15:24:38

+0

您确定何时将viewController推送到您发布或自动释放它们的navigationController? UIViewController * controller = [[UIViewController alloc] initMethodUsed]; [navigationController pushViewController:controller animated:YES]; [控制器发布]; – 2012-02-10 15:44:22

0

你实际上并没有释放viewControllers。你只需增加+1,然后减少-1。

实际上没有任何东西会受到您编写的用于释放viewControllers的代码的影响。

对于NavigationController,您可以调用popToRootViewController以释放除NavigationController的基本/根视图控制器以外的所有其他视图控制器。

+0

那么,我不想删除释放所有视图。只有特定的一个。怎么做 ? – OhDoh 2012-02-10 15:04:57

3

创建一个新的NSMutableArrayviewControllers,然后从新的NSMutableArray删除完成任何事情。 viewControllers仍由navigationController保留。

+0

如何删除特定的一个呢? – OhDoh 2012-02-10 15:07:25

+0

使用以下几种方法之一从'navigationController'删除'viewControllers':'popToRootViewControllerAnimated','popToViewController'或'popViewControllerAnimated'。另请参阅@Joel的答案。 – zaph 2012-02-10 15:20:31