Swift/SpriteKit - 无法打破强引用循环

标签 swift memory-leaks sprite-kit automatic-ref-counting

我在不了解强引用循环的情况下完成了一个 spritekit 游戏。我没有遇到任何崩溃或明显的问题,但使用仪器我可以看到我的对象在每个级别之间被保留(SKScene 应该在级别之间被释放)。

以下是我游戏的一般部分:

GameConfig 静态结构

我有一个全局可访问的静态结构,它引用了我的 ViewController。我在整个应用程序中使用此结构访问 viewController。我在 viewController 的 viewDidLoad

中分配 GameConfig.viewController = self

GameViewController

在这里我引用了我的 SKScene 和 SKView

var skView: MyView!
weak var scene: SKScene!

BaseScene

这是我的基础 SKScene 类。这是该类的唯一引用类本身的属性

let indicators: Indicators = Indicators()

KillScene BaseScene 的子类

在我的 BaseScene 子类中,我有许多包含在数组中的自定义子类。这些自定义子类确实引用了场景,但场景并没有直接引用它们。它只引用了它们的容器数组。示例:

var radarBlips: [RadarBlip] = []

我确实有一个属性与 KillScene 有很强的引用循环

var ship: KillShip = KillShip()

在我的 IndicatorsKillShip 类中,我都使用 weak 关键字引用了我的场景。

事实上,我已经找到了我引用场景的每个实例,并将 weak 放在它前面。

我试着做一个精简的游戏,在 Sprite 和场景之间创建一个强大的引用循环,然后打破它。我这样做很成功。但我似乎无法调试自己的游戏。

任何详细的建议都会有所帮助。我知道传递闭包很棘手。也许这与它有关?任何关于我可以寻找什么的建议都会很棒。我把 weak 放在了比我可能需要的更多的地方。

我无法让场景deinit

最佳答案

没有一种简单的方法可以做到这一点。检查所有相互引用的属性,并使用 weak 或 unowned。 spritekit 中更大的问题是检查闭包。当您运行延迟闭包(在 SKActions 中)和类似的事情时,在闭包中使用 [weak self] 很重要,这样它就不会使对象保持事件状态。在强引用循环被打破之前,添加比必要更多的弱引用和无主引用更容易,然后按照你的方式向后删除不需要的引用。

关于Swift/SpriteKit - 无法打破强引用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29811804/

相关文章:

android - 为什么图像由android :src in xml remain stored in heap?设置

PHP 5.5.6 随机内存泄漏

ios - SKSpriteNode 忽略物理停用

ios - 将当前设备位置识别为平面

ios - 我尝试向我的应用程序添加 map ,但我看到的只是黑屏......为什么?

ios - 如何设置所有 View Controller 导航栏的默认导航栏颜色、文本颜色

ios - 将子类添加到 Storyboard会崩溃

ios - Firebase 数据结构(最佳实践)

c - 内存泄漏以及修复内存泄漏后的错误

swift - 如何用操纵杆移动 Sprite ?