2017-08-27 42 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