我有一个视图控制器(称为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是否存在所谓的保留周期或强参考周期。可能是以下情况之一:
您在没有self
或weak
引用的SecondVC中的某些闭包中使用onowned
。因此,闭包对视图控制器具有很强的参考作用,反之亦然。
您在SecondVC中具有一些属性(具有强引用),该属性通过其他一些实体(也具有强引用)指向SecondVC。
因此,SecondVC无法从内存中取消分配。这样会导致内存泄漏。在这种情况下,您需要打破保留周期。通常,我们通过将引用之一设置为weak
来实现。
有关更多信息,请阅读Resolving Strong Reference Cycles Between Class Instances。
如需更多帮助,请显示视图控制器的完整代码。
关于ios - 从堆栈中删除 View Controller ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47258932/