Утечка памяти в SpriteKit в блоке запуска SKAction - PullRequest
0 голосов
/ 27 января 2019

Я вижу утечку памяти в следующем коде после того, как я деиницировал сцену:

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 в блок завершения может привести к утечке.

Заранее спасибо.

Mike

1 Ответ

0 голосов
/ 30 января 2019

waveNode создает сильную ссылку на себя.Вы можете отказаться от ссылки, так как она только уменьшит количество ссылок на 1 (это уже 1 слишком высоко).В данном конкретном случае, кажется, нет проблемы, как цитирует Knight0fDragon, поскольку этот runBlock служит для удаления самого объекта;однако, если бы это был настроен слабо-сильный танец, такой как:

[weak waveNode] in

guard let waveNode = waveNode else { return }

Apple обсуждает это на 31-й минуте своего WWDC по отладке памяти 2 года назад;кажется, что сообщество стремится сосредоточиться на слабых проблемах с самим собой, а не на этих «небольших утечках».Ссылка на это видео: https://developer.apple.com/videos/play/wwdc2016/410/

...