【问题标题】:xcode retain cycle not show in memory graphxcode保留周期未显示在内存图中
【发布时间】:2017-08-27 17:05:49
【问题描述】:

我试图了解 xcode 调试工具在检测保留周期方面的工作原理。 我有一个简单的父视图控制器和子视图控制器都持有彼此的引用。 在多次执行应用程序打开关闭 VC 后,当我打开调试工具时,它既没有显示保留周期问题也没有显示运行时问题。 请在下面找到代码示例和附加的xcode调试工具截图

class ViewController: UIViewController {
    var child: ChildViewController?

    @IBAction func open(_ sender: Any) {
        performSegue(withIdentifier: "segueChild", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "segueChild") {
             child = segue.destination as? ChildViewController
            child?.parentVC = self
        }
    }
}

class ChildViewController: UIViewController {
    var parentVC: ViewController?

    @IBAction func close(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }
}

【问题讨论】:

标签: swift xcode memory-management memory-leaks retain-cycle


【解决方案1】:

[编辑,真正的答案] 我认为您只是误读了可视化调试器。仔细查看您的屏幕截图,这些内存图实际上归类在 Retain Cycles 下。

但是请注意:

要真正浪费内存,您需要放弃对 UIViewController 的所有引用。只要父母仍然可以访问,父母和孩子都可以从某个地方访问,即使他们有一个保留周期。

(如果您用新的 VC 替换子 VC,实际上会中断之前的循环并替换为新的。通过不断更新 child VC 属性,您不会浪费任何东西要么。)

想象一下(所有箭头都很强):

                                    V--------------------
RootWindow --> GrandParentVC --> ParentVC --> ChildVC --^

这不是问题。

现在假设我们替换 GrandParentVC。创建了一个无法到达的循环:

RootWindow --> ANewVC

   V--------------------
ParentVC --> ChildVC --^

【讨论】:

  • 感谢您的回答,首先,项目名称是 ReatinCycle :),这就是为什么它被“归类为该名称”。我理解您所说的“创建了一个无法访问的循环:”是什么意思,但是在将根视图控制器更改为新的之后,图表仍然没有显示双链接箭头...
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2018-05-15
  • 2011-03-14
  • 2014-08-11
  • 2018-05-13
  • 2011-10-10
  • 2012-09-29
相关资源
最近更新 更多