ios如何正确释放一组 SKSpriteNode 从继承的对象

标签: sprite-kit ios Swift
发布时间: 2017/4/3 19:03:06
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想知道什么最佳的方式来解除分配的一组对象,从 SKSpriteNode 继承。我有以下代码︰

class Raindrop : SKSpriteNode
{    
weak var barSpriteRef: SKSpriteNode?

init(scene: SKScene, barSprite: SKSpriteNode)
{
    let texture = SKTexture(imageNamed: "RainDrop")

    super.init(texture: texture, color: SKColor.whiteColor(), size: texture.size())

    barSpriteRef = barSprite

    self.userInteractionEnabled = true

    let width = scene.view!.frame.width

    let randomPos = CGPointMake(CGFloat(arc4random()) % width, UIScreen.mainScreen().bounds.height + 50)

    self.position = randomPos
    self.zPosition = 1
    self.anchorPoint = CGPoint(x: 0.5, y: 0.5)

    scene.addChild(self)

    let moveDown = SKAction.moveToY(-UIScreen.mainScreen().bounds.height, duration: 8)
    self.runAction(moveDown)
}

required init?(coder aDecoder: NSCoder)
{
    fatalError("init(coder:) has not been implemented")
}

func kill()
{
    self.removeAllActions()
    self.removeFromParent()
}
}

函数 kill() 是我尝试在释放,但它不按预期方式工作。

我使用的一套就像这样︰

var raindrops = Set<Raindrop>()

解决方法 1:

ARC是如何工作

ARC并保持在内存中的对象的强引用。

SpriteKit

这也是在 SpriteKit 事实上每个节点由强烈引用 GameScene (或通过节点引用 GameScene ...) 保存在内存中。

您所做是正确的 (但可能还不够)

您试图释放你 Raindrop Sprite使用您 kill 方法

func kill() {
    self.removeAllActions()
    self.removeFromParent()
}

此方法会工作如果当前 Raindrop 引用只由它的父和一些行动。

但是如果到另一个节点创建这Set

var raindrops = Set<Raindrop>()

然后添加到您Sprite Set ,创建另一个强引用将保持您 Raindrop Sprite在内存中的。

示例

让我们定义的 GameScene 和英雄的节点。

class GameScene: SKScene {
    deinit { print("GameScene has been deallocated") }
}

class Hero: SKNode {
    deinit { print("Hero has been deallocated") }
}

deinit尽快释放该对象将打印到控制台的消息

现在让我们来看这代码

let scene = GameScene(size: CGSize(width: 100, height: 100))
var hero: SKNode? = Hero()
var set = Set<SKNode>([hero!])
scene.addChild(Hero())

有 3 强引用做英雄对象

  1. scene
  2. hero变量
  3. set变量

让我们删除第 2 引用

hero?.removeFromParent()
hero = nil

英雄是仍在内存中,因为强烈的引用 set

最后让我们来运行

set.removeAll()

现在我们得到了下面的消息,因为英雄终于被释放。

Hero has been deallocated
赞助商