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

Posted

技术标签:

【中文标题】iOS UINavigationController - 从导航堆栈中删除视图控制器确实会释放它【英文标题】:iOS UINavigationController - removing a view controller from the navigation stack does release it at all 【发布时间】:2016-09-09 06:05:19 【问题描述】:

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

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

A -> B -> C

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

删除代码:

    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 时。

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

感谢任何帮助。

【问题讨论】:

为此,我需要覆盖后退按钮,但我不想这样做。 当你从B推送C时,先弹出B不带动画,再推送C。这将删除 B 视图控制器而不会泄漏。 @pkc456 它不工作! 你可以只使用从 B 到 A 的委托并从那里推送到 C,然后 B 会得到适当的释放,你想过吗? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

所以,你可以像这样管理这个场景,

首先获取array of viewcontrollers,然后将其转换为mutable array,然后从中删除所需的对象或视图控制器,然后将该数组设置为viewcontrollersnavigation controller

您也可以参考this so post!

更新:

另一种方式:

   override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 


    self.removeFromParentViewController()

   //OR

    self.navigationController?.popViewControllerAnimated(false)



【讨论】:

不使用segues,我使用的是navigationController push and pop。 你可以做的一件事就是用 push 之类的动画来呈现 viewcontroller C 并在该 presentVC 方法的 completion handler 中删除 viewController B!!或者你可以在推送新的 VC 之前尝试self.navigationController?.popViewControllerAnimated(false)

以上是关于iOS UINavigationController - 从导航堆栈中删除视图控制器确实会释放它的主要内容,如果未能解决你的问题,请参考以下文章

使用 UINavigationController 从另一个控制器更新或重新加载 UIViewController?

带有标签栏的 presentViewController

将 managedObjectContext 发送到 viewController 崩溃

如何正确关闭作为模式呈现的 UINavigationController?

ID:[...] 的 NSManagedObject 已失效

在 UINavigationController 中设置时图像不显示