iOS UINavigationController - 从导航堆栈中删除视图控制器确实会释放它

时间:2016-09-09 06:05:19

标签: ios uiviewcontroller uinavigationcontroller

我一直在摆弄UINavigationController,但这个问题对我来说有点棘手,

我有一个带有三个视图控制器的UINavigationController。

A - > B - > ç

当我来到viewDidLoad()中的C视图控制器时,我现在从堆栈中删除B,如果我再次点击C它转到A,一切都按预期工作但B永远不会被释放但是C会这样做。 / p>

删除代码:

    if self.navigationController != nil{
        for viewController in (self.navigationController?.viewControllers)!{
            if viewController.isKindOfClass(MyVCKind.self){
                self.navigationController?.viewControllers.removeAtIndex((self.navigationController?.viewControllers.indexOf(viewController))!)
            }
        }
    }

所以我测试并分析了B视图控制器只是为了确保我没有任何泄漏,当我从B出来时一切都很好 - > A通过回击B,B被冲出,但问题是我手动从堆栈中移除B时。

仅供参考我不想设置自定义后退按钮并覆盖操作,我想要默认行为并且没有泄漏。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

在我的应用程序中进行网络调用时,我发现了另一个神秘的强大参考,这是非常奇怪的,这就是第二个视图控制器在修复泄漏后一切都按预期工作时没有被刷新的原因。以下代码工作正常。

 if self.navigationController != nil{
        for viewController in (self.navigationController?.viewControllers)!{
            if viewController.isKindOfClass(MyVCKind.self){
                self.navigationController?.viewControllers.removeAtIndex((self.navigationController?.viewControllers.indexOf(viewController))!)
            }
        }
    }

答案 1 :(得分:0)

这是因为(self.navigationController?.viewControllers返回不可变数组(即NSArray)。

因此,您无法从中删除对象。

因此,您可以管理此方案,例如,

首先获取array of viewcontrollers然后将其转换为mutable array,然后从中移除所需的对象或视图控件,然后将该数组设置为viewcontrollers的{​​{1}}

您也可以参考this so post

更新:

另一种方式:

navigation controller