如何从内存中清除SKSpriteNodes?

Con*_*sed 1 memory sprite-kit skspritenode swift

我通过调用一个创建SKSpriteNode子类实例的函数,从gameScene和其他对象中创建了一堆sprite.

例如,从GameScene,像这样:

let sizee = CGSize(width: 100, height: 100)
let posi = CGPoint(x: 200, y: 300)

func createSprite(){
    let new = Circle(color: SKColor.blue, size: sizee , position: posi)
    addChild(new)
    new.zPosition = 2
}
Run Code Online (Sandbox Code Playgroud)

在Circle中,我在完成一些动画后删除每个实例:

import SpriteKit

class Circle: SKSpriteNode {

    let fade = SKAction.fadeAlpha(to: 0.5, duration: 2)
    let myScale = SKAction.scaleX(to: 3, duration: 2)
    let die = SKAction.removeFromParent()

    override init(texture: SKTexture?, color: UIColor, size: CGSize) {
        super.init(texture: texture, color: color, size: size)
    }
    convenience init(color: UIColor, size: CGSize, position: CGPoint) {
        self.init(color: color, size: size)
        self.position = position
        self.run(SKAction.sequence([fade, die]))
        self.run(myScale)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
Run Code Online (Sandbox Code Playgroud)

这足以确保它们从内存中释放出来吗?

或者我是否必须做一些其他事情来从游戏世界和记忆中冲洗它们?

Ale*_*ano 5

几周前Apple已更新此页面:

Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中"正常工作",您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实例使用的内存.

引用计数仅适用于类的实例.结构和枚举是值类型,而不是引用类型,并且不通过引用存储和传递.

有一种方法可以防止实例取消初始化,从而造成泄漏.这称为强参考周期.看看这个答案,你可以详细了解我现在的意思.

看看你的代码我会这样做:

self.run(SKAction.group([fade, myScale], completion:  {
     [weak self] in
     guard let strongSelf = self else { return }
     strongSelf.removeFromParent()
}))
Run Code Online (Sandbox Code Playgroud)

  • 甚至不需要强大的自我,弱自我完美地工作(nil.removeFromParent()将不会做任何事情.) (2认同)