gpt4 book ai didi

swift - SKAction 运行 block 中的 SpriteKit 内存泄漏

转载 作者:行者123 更新时间:2023-11-28 05:46:44 24 4
gpt4 key购买 nike

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

场景的didMove:

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

提前致谢。

迈克

最佳答案

waveNode 正在创建对自身的强引用。您可以取消拥有该引用,因为它只会将其引用计数减 1(它已经 1 太高了)。在这种特殊情况下,似乎没有像 Knight0fDragon 所引用的那样的问题,因为此 runBlock 用于删除您的对象本身;然而,如果它设置了弱-强舞蹈,例如:

[weak waveNode] in

guard let waveNode = waveNode else { return }

Apple 在他们的 WWDC 的 31:00 分钟讨论了这个关于 2 年前的内存调试;社区似乎倾向于关注 self 弱点问题,而不是这些“较小的漏洞”。该视频的链接:https://developer.apple.com/videos/play/wwdc2016/410/

关于swift - SKAction 运行 block 中的 SpriteKit 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54392793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com