ios - 如何避免 subview Controller 的内存泄漏

标签 ios swift memory-management memory-leaks childviewcontroller

想象一个 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/

相关文章:

UILabel 上的 iOS 渐变效果

ios - 解析云代码错误 : success/error was not called (Code: 141, 版本 : 1. 9.0)

swift - 扩展元素类型为通用的集合 (Swift)

swift - 自定义 NSButton。单击时如何更改颜色

ios - tableView 和释放实例的问题

c - 为什么我的程序会出现段错误?我在堆栈上使用了太多内存吗?

ios - UITableView setEditing 不显示删除按钮

ios - 访问 AVAudioSession 的音频缓冲区

swift - UITextField 在 Swift 中设置最大字符长度

c# - 将 float* 编码到 C#