Swift / SpriteKit - 无法打破强引用循环
Swift / SpriteKit - Can't break strong reference cycle
我在不了解强引用循环的情况下完成了一个 spritekit 游戏。我没有遇到任何崩溃或明显的问题,但是使用仪器我可以看到我的对象在每个级别之间被保留(SKScene 应该在级别之间被释放)。
以下是我游戏的一般部分:
GameConfig
静态结构
我有一个引用我的 ViewController 的全局可访问静态结构。我在整个应用程序中使用此结构访问 viewController。我在 viewController 的 viewDidLoad
内部分配 GameConfig.viewController = self
GameViewController
在这里我引用了我的 SKScene 和 SKView
var skView: MyView!
weak var scene: SKScene!
BaseScene
这是我的基础 SKScene class。这是此 class 中唯一获得对 class 本身
的引用的 属性
let indicators: Indicators = Indicators()
KillScene
BaseScene
的子class
在我的 BaseScene 子class 中,我有许多包含在数组中的自定义子classes。这些自定义子 classes 确实引用了场景,但场景并没有直接引用它们。它只引用了它们的容器数组。示例:
var radarBlips: [RadarBlip] = []
我确实有一个 属性 与 KillScene
有很强的参考循环
var ship: KillShip = KillShip()
在我的 Indicators
和 KillShip
class 中,我都使用 weak
关键字引用了我的场景。
事实上,我已经找到了我引用场景的每个实例,并将 weak
放在它前面。
我试着做一个精简的游戏,在精灵和场景之间创建一个强大的引用循环,然后打破它。我这样做很成功。但是我似乎无法调试自己的游戏。
任何详细的建议都会有所帮助。我知道传递闭包很棘手。也许这与它有关?任何关于我可以寻找什么的建议都会很棒。我把 weak
放在了比我可能需要的更多的地方。
现场拍不到deinit
没有简单的方法可以做到这一点。检查所有相互引用的属性,并使用 weak 或 unowned。 spritekit 中更大的问题是检查闭包。当你 运行 延迟闭包(在 SKActions 中)和类似的事情时,在闭包中使用 [weak self]
很重要,这样它就不会让对象保持活动状态。在强引用循环被打破之前,添加比必要更多的弱点和无主更容易,然后按照你的方式向后删除不需要的。
我在不了解强引用循环的情况下完成了一个 spritekit 游戏。我没有遇到任何崩溃或明显的问题,但是使用仪器我可以看到我的对象在每个级别之间被保留(SKScene 应该在级别之间被释放)。
以下是我游戏的一般部分:
GameConfig
静态结构
我有一个引用我的 ViewController 的全局可访问静态结构。我在整个应用程序中使用此结构访问 viewController。我在 viewController 的 viewDidLoad
GameConfig.viewController = self
GameViewController
在这里我引用了我的 SKScene 和 SKView
var skView: MyView!
weak var scene: SKScene!
BaseScene
这是我的基础 SKScene class。这是此 class 中唯一获得对 class 本身
的引用的 属性let indicators: Indicators = Indicators()
KillScene
BaseScene
在我的 BaseScene 子class 中,我有许多包含在数组中的自定义子classes。这些自定义子 classes 确实引用了场景,但场景并没有直接引用它们。它只引用了它们的容器数组。示例:
var radarBlips: [RadarBlip] = []
我确实有一个 属性 与 KillScene
var ship: KillShip = KillShip()
在我的 Indicators
和 KillShip
class 中,我都使用 weak
关键字引用了我的场景。
事实上,我已经找到了我引用场景的每个实例,并将 weak
放在它前面。
我试着做一个精简的游戏,在精灵和场景之间创建一个强大的引用循环,然后打破它。我这样做很成功。但是我似乎无法调试自己的游戏。
任何详细的建议都会有所帮助。我知道传递闭包很棘手。也许这与它有关?任何关于我可以寻找什么的建议都会很棒。我把 weak
放在了比我可能需要的更多的地方。
现场拍不到deinit
没有简单的方法可以做到这一点。检查所有相互引用的属性,并使用 weak 或 unowned。 spritekit 中更大的问题是检查闭包。当你 运行 延迟闭包(在 SKActions 中)和类似的事情时,在闭包中使用 [weak self]
很重要,这样它就不会让对象保持活动状态。在强引用循环被打破之前,添加比必要更多的弱点和无主更容易,然后按照你的方式向后删除不需要的。