Swift 3(SpriteKit):在初始化后阻止弱SKSpriteNode变为零

时间:2017-01-20 03:56:42

标签: swift sprite-kit weak-references

在我的计划中,我目前在我的代码开头(在我的SKSpriteNode类中)将weak定义为GameScene并声明如下:

weak var tapFade: SKSpriteNode? = SKSpriteNode(color: UIColor.red, size: CGSize(width: 10, height: 10))

但是,由于它是weak且没有当前引用,因此在我需要使用之前,它会被删除并变为nil。同样在我的程序中,我初始化weak SKLabelNode,如下所示:

weak var tapToBegin: SKLabelNode? = SKLabelNode(text: "Tap to Begin")

并不像SKSpriteNode那样立即删除。我实现这一目标的方法是在我使用它之前重新声明SKLabelNode

tapToBegin = SKLabelNode(text: "Tap to Begin")

当我想使用它时,SKLabelNodenil。虽然,我尝试使用相同的方法重新声明SKSpriteNode,但它仍然是nil

注意:这是初始化的地方,我需要在我的程序中首先使用这些nodes

class GameScene: SKScene, SKPhysicsContactDelegate {

    //Initialisations are here
    weak var tapFade: SKSpriteNode? = SKSpriteNode(color: UIColor.red, size: CGSize(width: 10, height: 10))
    weak var tapToBegin: SKLabelNode? = SKLabelNode(text: "Tap to Begin")

    override func didMove(to view: SKView) {
        //I first use these nodes here
    }
}

有没有办法防止SKSpriteNode立即被解除初始化?另外,为什么SKSpriteNode会被立即删除,SKLabelNode不会被删除?

1 个答案:

答案 0 :(得分:2)

使用weak关键字将导致 SpriteNode 被ARC拾取并将被删除。因此,当您尝试与SpriteNode进行交互时,您将获得异常,因为它不再在内存中。在weak关键字前删除var

var tapFade:SKSpriteNode = SKSpriteNode(color: UIColor.red, size: CGSize(width: 10, height: 10))