2017-01-15 31 views
-1

我想知道是否有一種簡單的方法(或至少是一種方法)來找出程序中保留週期的位置。另外,如果我知道這些保留週期在哪裏存在,取決於它們的類型(例如變量或閉包),我如何使它們變弱。我需要停止與自我(我的GameScene)的所有保留週期,以便它不再需要時釋放並且我想重新啓動它。瞭解保留週期的位置並將其刪除

任何提示,建議,答案和反饋將不勝感激(並提供具體的代碼和例子將是首選)。謝謝。

編輯: @ Sweeper的回答正是我一直在尋找的。如果你有同樣的問題,他的答案會有所幫助。謝謝@Sweeper!

+1

在這裏,你有幾乎所有關於你當前的問題的答案:http://stackoverflow.com/a/41660653/3402095另外,這個問題的答案會引用蘋果文檔,ARC - 「類實例之間的強參考循環」部分與人和公寓。 – Whirlwind

+1

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

+0

@Whirlwind清道夫的答案是我想從這個答案不知道的。無論如何感謝您的回覆 –

回答

9

如果您使用的是Xcode 8或更高版本,則可以使用內存圖thingy來查看哪個對象持有對哪個對象的引用。

要查看內存圖,首先使用Xcode構建和運行您的應用程序。當你想檢查您是否創建正確丟棄所有的情況下,去這個選項卡上的左側窗格中:

enter image description here

然後按右側有按鈕:

enter image description here

之後,選擇最下方的選項 - 查看內存圖層級:

enter image description here

現在,它會告訴你一切都是在內存中的對象:

enter image description here

就我而言,我有一個GameSystem對象,6個ButtonNode對象和其他幾個人。你會注意到在GameSystem對象旁邊有一個!。這意味着這個對象被泄露。此外,GameScene不應該在內存中,因爲當前場景是TitleScene。讓我們來看看什麼是通過點擊實例保留它:

enter image description here

現在你可以清楚地看到,它是由一個封閉保留!

這就是您如何使用內存圖來查看應該在哪裏放置弱引用並避免保留週期。

+0

很好的答案......我完全忘記了這一點,因爲我在Xcode 7.x上永遠如此。x和剛剛切換到最新版本。當涉及泄漏檢測時,似乎工作得很好。此外,它認爲這不適用於Swift 2.3項目 – Whirlwind