xcode保留周期不显示在内存图
问题描述:
我想了解xcode调试工具如何在检测保留周期方面工作。 我有一个简单的父和子视图控制器都拥有彼此的引用。 并且在几次执行应用程序打开关闭VC之后,当我打开调试工具时,它既不显示保留周期也不存在运行时问题。 请从下面的代码示例和连接的Xcode调试工具的截图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)
}
}
答
[编辑,真正的答案] 我觉得你只是误读视觉调试器。仔细查看屏幕截图,这些内存图实际上归类于Retain Cycles。然而
注:
要真正浪费内存,你需要放弃所有引用父UIViewController
。只要家长仍然可以访问,父母和孩子都可以从某个地方访问,即使他们有一个保留周期。
(如果你用一个新的更换子VC,以前的周期实际上打破,通过更换新的。通过不断更新child
VC财产,你也不浪费任何东西。)
想象一下(所有箭头都很强):
V--------------------
RootWindow --> GrandParentVC --> ParentVC --> ChildVC --^
这不是问题。
现在假设我们替换GrandParentVC。创建了无法访问的周期:
RootWindow --> ANewVC
V--------------------
ParentVC --> ChildVC --^
+1
感谢回答, 首先,项目名称是ReatinCycle :),这就是为什么它被“归类为该名称”。我明白你的意思是“创建一个无法访问的循环:”但在将根视图控制器更改为新的循环后,该图形仍然不显示双箭头... – mihatel
您是否找到了答案?我刚刚问了一个类似问题。哈哈https://*.com/questions/48988810/xcode-memory-graph-debugger-not-showing-cycles – Fogmeister
@Fogmeister否:),但它是伟大的它不仅是我:D – mihatel