想象一个 ViewController 由多个子 ViewController 组成,如下所示:
ViewController1:
- ViewController2
- ViewController3
ViewController2 没有改变,所以它是在 Storyboard 上用 containerViews 定义的。为了通过 ViewController1 获取 ViewController2 的引用,我执行以下操作:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destination = segue.destination
if let viewController2 = destination as? ViewController2 {
self.viewController2 = viewController2
}
}
至于 ViewController3,它是动态的,因此它以编程方式添加到 ViewController1 中,如下所示:
addChildViewController(viewController3)
view.addSubview(viewController3.view)
viewController3.didMove(toParentViewController: self)
我的问题是,对于这两种情况,处理 viewController2 和 viewController3 引用的内存管理的正确方法是什么。它们应该是弱引用还是强引用?
谢谢!
最佳答案
基本的经验法则是让所有“向外”方向的引用都强,“向后”方向的引用都弱。
在您的例子中,ViewController1 是基础 View Controller 。它拥有 ViewController2 和 ViewController3,因此这些引用应该很强。 ViewController2 和 ViewController3 将返回指向 View Controller 1,因此它们的引用应该是弱引用。
将您的对象图想象成一棵树。它锚定到根部的 UIApplication,所有内容都锚定到它。树上层的对象应该由它们的根对象拥有,但不应该拥有对其根对象的引用。
关于ios - 如何避免 subview Controller 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48629689/