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

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


将pageingMenuController添加到SecondVC的代码:

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


返回FirstVC的代码:

self.navigationController?.popViewController(animated: true)


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


在FirstVC中---内存:20MB
转到SecondVC ---内存:40MB
回到FirstVC ---内存:40MB
转到SecondVC ---内存:60MB
回到FirstVC ---内存:60MB


虽然我从导航控制器弹出视图控制器(SecondVC),但内存不会释放。我该怎么办,我在做什么错?

最佳答案

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


您在没有selfweak引用的SecondVC中的某些闭包中使用onowned。因此,闭包对视图控制器具有很强的参考作用,反之亦然。
您在SecondVC中具有一些属性(具有强引用),该属性通过其他一些实体(也具有强引用)指向SecondVC。


因此,SecondVC无法从内存中取消分配。这样会导致内存泄漏。在这种情况下,您需要打破保留周期。通常,我们通过将引用之一设置为weak来实现。

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

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

关于ios - 从堆栈中删除 View Controller ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47258932/

10-11 16:20