了解保留周期的位置并将其删除

时间:2017-01-15 11:16:44

标签: swift sprite-kit swift3 weak-references retain-cycle

我想知道是否有一种简单的方法(或至少是一种方法)来找出程序中存在保留周期的位置。此外,如果我知道这些保留周期存在的位置,取决于它们的类型(例如变量或闭包),我该如何使它们变弱。我需要使用self(我的GameScene)停止所有保留周期,以便在我不再需要它时解除分配并且我想重新启动它。

我们将非常感谢任何提示,建议,答案和反馈(并且首选提供特定代码和示例)。谢谢。

编辑: @ Sweeper的回答正是我想要的。如果你遇到同样的问题,他的回答会有所帮助。谢谢@Sweeper!

1 个答案:

答案 0 :(得分:15)

如果您使用的是Xcode 8或更高版本,则可以使用内存图来查看哪个对象包含对哪个对象的引用。

要查看内存图,请先使用Xcode构建并运行应用程序。如果要检查是否已正确丢弃所有创建的实例,请转到左侧窗格中的此选项卡:

enter image description here

然后按右侧的按钮:

enter image description here

之后,选择最底部的选项 - View Memory Graph Hierarchy:

enter image description here

现在它将显示内存中的所有对象:

enter image description here

就我而言,我有一个GameSystem个对象,6个ButtonNode个对象和一些其他对象。您会注意到!对象旁边有一点GameSystem。这意味着这个对象泄露了。此外,GameScene不应再在内存中,因为当前场景为TitleScene。让我们通过单击实例来查看保留它的内容:

enter image description here

现在你可以清楚地看到它被一个闭包保留了!

这就是你如何使用内存图来查看应该放置弱引用的位置并避免保留周期。