使用instantiateViewControllerWithIdentifier时,从后台内存中删除UIViewController的正确方法是什么?

时间:2015-05-04 17:08:29

标签: ios objective-c uiviewcontroller

我正在展示一个像这样的视图控制器:

UINavigationController * PlacesNC = [storyboard instantiateViewControllerWithIdentifier:@"PlacesNavigationController"];

[self presentViewController:PlacesNC animated:YES completion:nil];

一旦我进入使用导航视图控制器呈现的最终视图控制器,如何从内存中删除初始视图控制器?

修改

在我的应用程序中,可以以这种方式呈现多个UIViewControllers。我将尝试表示我的堆栈可能是什么样的。

____ modal vc 5 * current view controller
____ modal vc 4
____ modal vc 3
____ modal vc 2
____ modal vc 1
____ root view controller

所以,如果我有这样的堆栈,我怎么能删除vc 1,2,3甚至4,以便我可以释放这些其他视图控制器正用完的内存?这可能不是正确允许这样的堆栈,但这就是我现在所拥有的,我只需要一个临时修复,因为iPhone 4无法处理像这样的堆栈中使用的内存量。因此,在我提出另一种方式来呈现我的视图控制器之前,我只需要能够从堆栈中删除它们中的一些。

1 个答案:

答案 0 :(得分:2)

你不能,也不想。它仍然在视图控制器层次结构中,正如我在此图中所示(显示了DrillViewController,但RootViewController仍在那里,“在它后面”):

enter image description here

呈现视图控制器不会破坏呈现的视图控制器,也不应该;如果确实如此,您将无法解除所呈现的视图控制器并找到仍然坐在那里的呈现视图控制器。

此外,在iOS 8中,完全可以呈现视图控制器并在呈现视图控制器的视图前面显示所呈现的视图控制器视图,该视图在其后面仍然可见。例如,这就是UIAlertController演示的工作原理。显然,如果呈现视图控制器在那种情况下不再存在,那将是一场灾难。

现在,你的意思可能是:我的视图控制器有一个使用大量内存的属性。当我的视图控制器不在最前面时,我不需要继续。所以当我提出另一个视图控制器时,我想释放它。在这种情况下,只需手动管理内存:在nil上将该属性设置为viewDidDisappear:,并在显示的视图控制器被解除时在viewWillAppear:上恢复其值(以某种方式)。

最后一个建议:也许真正的问题是,呈现的视图控制器只是错误的分层排列类型。也许您真正想做的是使用新的视图控制器替换视图控制器中的原始视图控制器 - 因为您从不回到它并且不需要它不再。这是完全可能的,但当然你需要建立一个不同的层次结构。