我在不知道强参考循环的情况下完成了一个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()
BaseScene
的KillScene
子类
在我的BaseScene子类中,数组中包含许多自定义子类。这些自定义子类确实引用了场景,但场景并没有直接引用它们。它只引用了它们的容器数组。示例:
var radarBlips: [RadarBlip] = []
我确实有一个属性与KillScene
有很强的参考循环
var ship: KillShip = KillShip()
在我的Indicators
和KillShip
类中,我都使用weak
关键字引用了我的场景。
事实上,我已经找到了每一个引用场景的实例,并将weak
放在它前面
我试着制作一个精简的游戏,在精灵和场景之间创建一个强大的参考循环,然后打破它。我做得很成功。但我似乎无法调试自己的游戏。
任何详细的建议都会有所帮助。我知道传递闭包很棘手。也许这与此有关?任何关于我能找到什么的建议都会很好。我已经把weak
放在了比我可能需要的更多的地方。
我无法将场景发送到deinit
这不是一个简单的方法。检查所有相互引用并使用弱或无主的属性。spritekit中更大的问题是检查闭包。当您运行延迟闭包(在SKActions中)和类似的事情时,在闭包中使用[weak self]
是很重要的,这样它就不会使对象保持活动状态。在强引用循环被打破之前,添加更多的weak和unowned比必要的更容易,然后反向删除不必要的weak。