手动设置NavicationController.viewControllers是否会释放现有的viewcontrollers?

时间:2014-12-17 20:14:33

标签: ios objective-c uiviewcontroller

我的代码替换了NavigationController中的整个ViewControllers堆栈,作为在一系列不同UI场景线程之间切换的“重置”。我决定只手动更改NavigationController.viewControllers数组,而不是为storyboard中的每个流创建不同的NavigationController:

self.navController.viewControllers = [vc1, vc2]

旧的ViewControllers堆栈会发生什么?它们会自动释放/卸载吗?或者它们是否永远存在并因此导致内存泄漏?

注意: 我知道unwind segue,但我不想使用它,因为即使我解开NavVC中的第一个VC,我仍然需要用不同的VC替换它,设置.viewController是我知道的唯一方法导致“后退按钮”

2 个答案:

答案 0 :(得分:0)

  

旧的ViewControllers堆栈会发生什么?

viewControllers属性指向一个数组并具有复制语义,因此当您将视图控制器数组分配给该属性时,导航控制器将复制该数组。当您为该属性分配不同的数组时,前一个将被释放(假设没有其他强引用)。对于数组中的任何视图控制器也是如此 - 如果没有其他任何对它们的强引用,它们将被释放。这与任何其他Objective-C对象没有什么不同。

答案 1 :(得分:0)

设置新的视图控制器后,UINavigationController将失去对旧堆栈的强引用。如果您对旧堆栈中的项目没有任何剩余的强引用,它们确实将由ARC发布。

验证此行为的一种方法是覆盖要释放的视图控制器中的-(void)dealloc,并在其中放置一些日志记录。你应该能够看到何时调用dealloc。