从堆栈

时间:2017-11-13 07:18:46

标签: ios swift

我有一个视图控制器(称为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
  6. 虽然我从导航控制器弹出视图控制器(SecondVC),但内存并不是免费的。我该怎么做以及我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

  1. 您在没有selfweak引用的SecondVC中的某个闭包中使用onowned。因此,闭包具有对视图控制器的强引用,反之亦然。

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

  3. 因为这个SecondVC无法从内存中释放出来。而且你得到了内存泄漏。如果是这种情况,您需要中断保留周期。通常我们通过制作一个引用weak来做到这一点。

    有关详细信息,请参阅Resolving Strong Reference Cycles Between Class Instances

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