使用 instantiateViewControllerWithIdentifier 时从后台内存中删除 UIViewController 的正确方法是什么?
What is the proper way to remove a UIViewController from the background memory when using instantiateViewControllerWithIdentifier?
我正在展示这样的视图控制器:
UINavigationController * PlacesNC = [storyboard instantiateViewControllerWithIdentifier:@"PlacesNavigationController"];
[self presentViewController:PlacesNC animated:YES completion:nil];
当我到达使用导航视图控制器显示的最终视图控制器时,如何从内存中删除初始视图控制器?
编辑
在我的应用程序中,可以用这种方式呈现多个 UIViewController。我将尝试展示我的堆栈的样子。
____ 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 无法处理这样的堆栈中使用的内存量。因此,在我想出另一种方式来呈现我的视图控制器之前,我只需要能够从堆栈中删除其中的一些。
你不能,你也不想。它仍然在视图控制器层次结构中,正如我在此图中所示(显示了 DrillViewController,但 RootViewController 仍然存在,"behind" 它):
呈现视图控制器不会破坏呈现的视图控制器,也不应该;如果是这样,您将无法关闭呈现的视图控制器并发现呈现的视图控制器仍然坐在那里。
此外,在 iOS 8 中,完全可以呈现一个视图控制器并将呈现的视图控制器的视图 显示在 呈现视图控制器的视图之前,这在它后面仍然可见。例如,这就是 UIAlertController 演示文稿的工作方式。显然,如果呈现视图控制器在那种情况下不复存在,那将是一场灾难。
现在,您真正的意思可能是:我的视图控制器有一个 a 属性 使用大量内存 。当我的视图控制器不在最前面时,我不需要坚持下去。所以我想在展示另一个视图控制器时释放它。在这种情况下,只需手动管理内存:在 viewDidDisappear:
上将 属性 设置为 nil
,并在呈现的视图控制器被关闭时(以某种方式)在 viewWillAppear:
上恢复其值.
最后一个建议:也许真正的问题是呈现的视图控制器只是错误的层次结构类型。也许你真正想做的是用新的视图控制器替换你在视图控制器中的原始视图控制器——因为你永远不会回到它不再需要它了。这是完全可能的,但当然你需要设置不同的层次结构。
我正在展示这样的视图控制器:
UINavigationController * PlacesNC = [storyboard instantiateViewControllerWithIdentifier:@"PlacesNavigationController"];
[self presentViewController:PlacesNC animated:YES completion:nil];
当我到达使用导航视图控制器显示的最终视图控制器时,如何从内存中删除初始视图控制器?
编辑
在我的应用程序中,可以用这种方式呈现多个 UIViewController。我将尝试展示我的堆栈的样子。
____ 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 无法处理这样的堆栈中使用的内存量。因此,在我想出另一种方式来呈现我的视图控制器之前,我只需要能够从堆栈中删除其中的一些。
你不能,你也不想。它仍然在视图控制器层次结构中,正如我在此图中所示(显示了 DrillViewController,但 RootViewController 仍然存在,"behind" 它):
呈现视图控制器不会破坏呈现的视图控制器,也不应该;如果是这样,您将无法关闭呈现的视图控制器并发现呈现的视图控制器仍然坐在那里。
此外,在 iOS 8 中,完全可以呈现一个视图控制器并将呈现的视图控制器的视图 显示在 呈现视图控制器的视图之前,这在它后面仍然可见。例如,这就是 UIAlertController 演示文稿的工作方式。显然,如果呈现视图控制器在那种情况下不复存在,那将是一场灾难。
现在,您真正的意思可能是:我的视图控制器有一个 a 属性 使用大量内存 。当我的视图控制器不在最前面时,我不需要坚持下去。所以我想在展示另一个视图控制器时释放它。在这种情况下,只需手动管理内存:在 viewDidDisappear:
上将 属性 设置为 nil
,并在呈现的视图控制器被关闭时(以某种方式)在 viewWillAppear:
上恢复其值.
最后一个建议:也许真正的问题是呈现的视图控制器只是错误的层次结构类型。也许你真正想做的是用新的视图控制器替换你在视图控制器中的原始视图控制器——因为你永远不会回到它不再需要它了。这是完全可能的,但当然你需要设置不同的层次结构。