2017-01-15 30 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