Swift / SpriteKit - 无法打破强参考周期



我在不知道强参考循环的情况下完成了一个spritkit游戏。我没有任何崩溃或明显的问题,但使用仪器,我可以看到我的对象在每个级别之间被保留(SKScene应该在级别之间被取消定位)。

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

GameConfig静态结构

我有一个全局可访问的静态结构,它引用了我的ViewController。我使用这个结构从整个应用程序访问viewController。我在视图中分配GameConfig.viewController = self控制器的viewDidLoad

GameViewController

在这里,我引用了我的SKScene和SKView作为

var skView: MyView!
weak var scene: SKScene!

BaseScene

这是我的基础SKScene类。这是这个类的唯一属性,它引用了类本身

let indicators: Indicators = Indicators()

BaseSceneKillScene子类

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

var radarBlips: [RadarBlip] = []

我确实有一个属性与KillScene有很强的参考循环

var ship: KillShip = KillShip()

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

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

我试着制作一个精简的游戏,在精灵和场景之间创建一个强大的参考循环,然后打破它。我做得很成功。但我似乎无法调试自己的游戏。

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

我无法将场景发送到deinit

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

最新更新