PresentScene 内存:removeAllChildren 是不是传播?

Posted

技术标签:

【中文标题】PresentScene 内存:removeAllChildren 是不是传播?【英文标题】:PresentScene memory : Does removeAllChildren propagate?PresentScene 内存:removeAllChildren 是否传播? 【发布时间】:2014-12-12 02:37:17 【问题描述】:

我有一个带有菜单场景和游戏场景的简单游戏。游戏场景结束后,返回菜单场景,然后进入游戏场景,以此类推。

所有转换都使用self.view?.presentScene(Scene(size: self.view!.bounds.size)) 处理。

我还在 MenuScene 和 GameScene 中添加了这段代码:

override func willMoveFromView(view: SKView) 
    self.removeAllActions()
    self.removeAllChildren()

但是,使用分析工具“Allocations”和“Leaks”,我意识到在每个presentScene 之后内存消耗都在不断增长(尽管只是一点点)。没有“泄漏”检测。

removeAllChildren 是否传播到节点内的所有节点?还是我应该手动删除 children 中的所有子项?

注意:我使用的是 XCode 6.1.1,iPhone 模拟器 ios 8.1

【问题讨论】:

分配给添加到场景的节点的内存应该在您转换到新场景时自动释放,除非有对场景或节点的引用。 您不需要自己调用这两个 removeAll* 函数中的任何一个。如果您的代码的内存管理正确,Sprite Kit 将正确清理场景。您这样做的事实只是您希望它能在其他地方解决您的记忆问题。寻找实际问题,例如场景仍然被强引用(即,您可能已将其添加到数组或单例属性中)或任何导致保留周期的节点(即兄弟节点相互强引用或它们的父节点是肯定的方法创建一个保留周期)。运行分析构建以获取一些指针。 【参考方案1】:

使用函数deinit 记录一些println() 并查看是否deinit,我发现MenuScene 被正确地取消初始化但不是GameScene。 我必须申请

self.removeAllActions()
self.removeAllChildren()

到主场景节点的节点之一。

【讨论】:

以上是关于PresentScene 内存:removeAllChildren 是不是传播?的主要内容,如果未能解决你的问题,请参考以下文章

self.view?.presentScene:在展开可选值时意外发现 nil (Swift)

ArrayList.removeAll() vs HashSet.removeAll()

ArrayList.clear() 和 ArrayList.removeAll() 有啥区别?

Java 中 HashSet 的 removeAll 性能分析

LINQ:RemoveAll 并删除元素

如何使用 removeAll() 从 JFrame 中删除所有组件?