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