取消场景初始化后,我在以下代码中看到内存泄漏:
didMove of scene:
run(SKAction.repeatForever(SKAction.sequence([SKAction.wait(forDuration: 1.5), SKAction.run { [unowned self] in self.generateWave() }])))
功能:
func generateWave()
{
let bgImage = self.childNode(withName: "bgImage") as! SKSpriteNode
let waveNode = SKSpriteNode(texture: atlasSplashScreen.textureNamed("SplashScreenWave"))
waveNode.position = CGPoint(x: -207, y: -60.8)
bgImage.addChild(waveNode)
let waveMove = SKAction.moveTo(x: self.frame.width / 2, duration: 6)
waveNode.run(waveMove)
{
waveNode.removeFromParent()
}
}
将最后一行更改为此可以解决泄漏:
waveNode.run(SKAction.sequence([waveMove, SKAction.removeFromParent()]))
你知道我在做什么错吗?我以为我可以正确处理薄弱的/无用的东西,但是现在我不确定。我不明白为什么将removeFromParent行放在完成块中会导致泄漏。
谢谢。
迈克
答案 0 :(得分:1)
waveNode正在为其自身创建强大的参考。您可以不拥有该引用,因为它只会将其引用计数减1(它已经太高了1)。在这种特殊情况下,似乎没有像Knight0fDragon那样引人关注的问题,因为此runBlock用于删除对象本身。但是,如果设置的是弱劲舞,例如:
[weak waveNode] in
guard let waveNode = waveNode else { return }
Apple在两年前的WWDC的第31:00分钟讨论了有关内存调试的问题;似乎社区倾向于将精力集中在弱小的自我问题上,而不是这些“较小的漏洞”。链接到该视频:https://developer.apple.com/videos/play/wwdc2016/410/