swift 3 (SpriteKit) : Stop weak SKSpriteNode from becoming nil after initialisation

标签 swift sprite-kit weak-references

在我的程序中,我目前在代码的开头(在我的 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/

相关文章:

swift - 在完成 if 语句之前运行以下脚本

ios - 值已更改,但图表未 swift 显示

ios - 如何快速检查@NSManaged 属性是否为零?

swift - 在 SpriteKit 中为弹跳球创建音效

swift - 您可以在 Mac Playground 中处理键盘事件(例如按向左或向右箭头)吗?

android - SQLiteOpenHelper 同步

objective-c - 如果在 Objective-c 中作为参数传递,引用是否仍然很弱?

处理类对象的 MATLAB 弱引用

ios - Swift - 按名称获取属性崩溃并出现 valueForUndefinedKey 错误

sprite-kit - SpriteKit : How to identify the previous scene the user is coming from?