在我的程序中,我目前在代码的开头(在我的 GameScene
类中)将 SKSpriteNode
定义为 weak
并声明它像这样:
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")
当我想使用它时,这使得 SKLabelNode
不是 nil
。虽然,我尝试用同样的方法重新声明 SKSpriteNode
,但它仍然是 nil
。
注意:这是初始化的位置,也是我需要在我的程序中首先使用这些节点
的地方:
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
却没有?
最佳答案
使用 weak 关键字将导致 SpriteNode 被 ARC 拾取并被删除。所以当你尝试与 SpriteNode 交互时,你会得到一个异常,因为它不再在内存中。去掉 var
关键字前的 weak
。
var tapFade:SKSpriteNode = SKSpriteNode(color: UIColor.red, size: CGSize(width: 10, height: 10))
关于 swift 3 (SpriteKit) : Stop weak SKSpriteNode from becoming nil after initialisation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755855/