我在没有强参考周期知识的情况下完成了一个spritekit游戏。我没有任何崩溃或明显的问题,但使用工具我可以看到我的对象被保留在每个级别之间(SKScene应该在各级之间解除分配)。
以下是我游戏的一般内容:
GameConfig
静态结构
我有一个全局可访问的静态结构,它引用了我的ViewController。我从整个应用程序使用此结构访问viewController。我在viewController的GameConfig.viewController = self
viewDidLoad
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()
在我的Indicators
和KillShip
课程中,我使用weak
关键字引用了我的场景。
事实上,我已经找到了每个引用场景的实例,并将weak
放在它前面。
我尝试制作一个精简游戏,并在精灵和场景之间创建一个强大的参考循环,然后打破它。我成功了。但我似乎无法调试我自己的游戏。
任何详细的建议都会有所帮助。我知道通过关闭周围的诡计。也许这与它有关?关于我能找到什么的任何建议都会很棒。我已将weak
放在比我可能需要的更多的地方。
我无法将场景转移到deinit
答案 0 :(得分:0)
没有一种简单的方法可以做到这一点。检查所有相互引用的属性,并使用弱或无主。 spritekit中更大的问题是检查闭包。如果您正在运行延迟闭包(在SKActions中)以及类似的事情,那么在闭包中使用[weak self]
非常重要,因此它不会使对象保持活跃状态。在强大的参考周期被打破之后,更容易添加更多的弱点并且不必要地拥有它,然后向后工作以删除不必要的参考周期。