2017-08-27 34 views
0

我想了解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) 
    } 
} 

ChildViewController

ParentViewController

+0

您是否找到了答案?我刚刚问了一个类似问题。哈哈https://stackoverflow.com/questions/48988810/xcode-memory-graph-debugger-not-showing-cycles – Fogmeister

+1

@Fogmeister否:),但它是伟大的它不仅是我:D – mihatel

回答

-1

[编辑,真正的答案] 我觉得你只是误读视觉调试器。仔细查看屏幕截图,这些内存图实际上归类于Retain Cycles。然而

注:

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

(如果你用一个新的更换子VC,以前的周期实际上打破,通过更换新的。通过不断更新child VC财产,你也不浪费任何东西。)

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

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

这不是问题。

现在假设我们替换GrandParentVC。创建了无法访问的周期:

RootWindow --> ANewVC 

    V-------------------- 
ParentVC --> ChildVC --^ 
+1

感谢回答, 首先,项目名称是ReatinCycle :),这就是为什么它被“归类为该名称”。我明白你的意思是“创建一个无法访问的循环:”但在将根视图控制器更改为新的循环后,该图形仍然不显示双箭头... – mihatel