知道保留循环在哪里并删除它们

Knowing where retain cycles are and removing them

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

任何提示、建议、答案和反馈将不胜感激(最好提供具体的代码和示例)。谢谢。

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

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

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

然后按右边的按钮:

之后,select bottom-most 选项 - 查看内存图层次结构:

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

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

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

这就是您如何使用内存图来查看应该放在哪里 weak-references 并避免保留循环。