SKAction运行块中的SpriteKit内存泄漏

时间:2019-01-27 20:56:11

标签: swift sprite-kit

取消场景初始化后,我在以下代码中看到内存泄漏:

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行放在完成块中会导致泄漏。

谢谢。

迈克

1 个答案:

答案 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/