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

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

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

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

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

最佳答案

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

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

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

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

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

关于swift - 知道保留循环在哪里并删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660486/

相关文章:

ios - 将 React Native iOS 项目扩展到 tvOS - 链接库

swift - 为什么让 x 作为 Float 大小写在 Any 变量的开关中不匹配?

ios - SKSpriteNode 不会居中

ios - Swift 中指针的替代品?

ios - 如何在 swift 3 的 performselector 中发送多个参数?

memory-management - Swift程序中有必要使用autoreleasepool吗?

Objective-C 到 Swift 等价物

ios - 如何在 spriteKit 中进行相机移动

ios - 为什么当我按下 RETURN 键时我的键盘没有消失?

ios - 来自 UNNotificationSound 的声音名称