【问题标题】:Remove view controllers from stack从堆栈中删除视图控制器
【发布时间】:2017-11-13 07:18:45
【问题描述】:

我有一个视图控制器(称为 FirstVC),它通过 segue 转到另一个视图控制器(称为 SecondVC)。在 SecondVC 中,我有一个 PagingMenuController,它是一个分页菜单库。 pagingMenuController 本身具有要显示的视图控制器。 将视图控制器添加到 pagingMenuController 的代码:

fileprivate var pagingControllers: [UIViewController] {
    return [viewControllerList,viewControllerMap]
}

将 pagingMenuController 添加到 SecondVC 的代码:

addChildViewController(pagingMenuController)
view.addSubview(pagingMenuController.view)
pagingMenuController.didMove(toParentViewController: self)

返回 FirstVC 的代码:

self.navigationController?.popViewController(animated: true)

每次我去 SecondVC 再回到 FirstVC 时,都会加载 20MB 的额外内存。假设我正在这样做:

  1. 在 FirstVC 中 --- 内存:20MB
  2. 转到 SecondVC --- 内存:40MB
  3. 返回 FirstVC --- 内存:40MB
  4. 转到 SecondVC --- 内存:60MB
  5. 返回 FirstVC --- 内存:60MB

虽然我从导航控制器弹出视图控制器(SecondVC),但内存并没有释放。我应该怎么做,我做错了什么?

【问题讨论】:

标签: ios swift


【解决方案1】:

让我们从显而易见的开始。检查您的 SecondVC 是否有所谓的保留周期或强参考周期。可能是以下情况之一:

  1. 您在 SecondVC 的某个闭包中使用了 self,而没有 weakonowned 引用。所以闭包对视图控制器有很强的引用,反之亦然。

  2. 您在 SecondVC 中有一些属性(具有强引用),通过其他一些实体(也具有强引用)指向 SecondVC。

因为这个 SecondVC 不能从内存中释放。你得到一个内存泄漏。如果是这种情况,您需要打破保留周期。通常我们通过引用weak 之一来做到这一点。

更多信息请阅读Resolving Strong Reference Cycles Between Class Instances

如需更多帮助,请显示视图控制器的完整代码。

【讨论】:

  • 如何找到保留周期?
  • 您应该检查您的 SecondVC 是否存在我在答案中描述的情况:闭包和来自其他类的依赖项。注意强引用。您也可以向我们展示您的代码,我会尽力为您指出。
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
相关资源
最近更新 更多