weak 变量中间为 nil

weak variable is intermediately nil

weak变量什么时候变为nil?

    weak var backgroundNode = SKSpriteNode(texture: SKTexture(image: initialBackgroundImage!))
    backgroundNode!.position = CGPoint(x: rootSkScene!.frame.midX, y: rootSkScene!.frame.midY)

总是:

fatal error: unexpectedly found nil while unwrapping an Optional value

Xcode error

局部变量应该总是很强大。这样,如果您创建一个对象并将其保存到局部变量,则局部变量提供的强引用会使该对象保持活动状态。当您退出当前作用域时,局部变量会从堆栈中弹出,并且它的强引用也会消失。

在您的代码中,SKSpriteNode initWithTexture 方法创建了一个新的 sprite kit 节点并 returns 它。在函数returns处,init函数不再对该对象有强引用。您将 initWithTexture 调用的结果保存到一个弱变量,因此在该语句的末尾,有 NO 个对该对象的强引用。它立即被释放。这就是为什么它变成零。

解决方案:将局部变量更改为 strong。变化:

weak var backgroundNode = SKSpriteNode(texture: SKTexture(image: initialBackgroundImage!))

var backgroundNode = SKSpriteNode(texture: SKTexture(image: initialBackgroundImage!))

如此弱的变量意味着该引用不会将引用计数器增加 1。如您所知,如果计数器等于零,对象将被删除。你在这里做什么 - 你正在创建变量,但由于它很弱,它的计数器等于零并且它被破坏了。也因为它很弱——当它销毁它的引用时会自动变成 nil 值。

所以我们得到的是,在第一行你创建了对象,它立即销毁并且引用变成了 nil。在第二行中,您尝试使用此变量做一些工作,但由于它是 nil,您会得到这样的异常。希望对您有所帮助。

要修复此错误,只需使用

删除第一行代码
let backgroundNode = SKSpriteNode(texture: SKTexture(image: initialBackgroundImage!))