弱变量什么时候变为零?
weak var backgroundNode = SKSpriteNode(texture: SKTexture(image: initialBackgroundImage!))
backgroundNode!.position = CGPoint(x: rootSkScene!.frame.midX, y: rootSkScene!.frame.midY)
永远得到:
致命错误:在解包可选值时意外发现nil
答案 0 :(得分:3)
局部变量应该总是很强大。这样,如果创建对象并将其保存到局部变量,则局部变量提供的强引用可使对象保持活动状态。当你退出当前范围时,局部变量会从堆栈中弹出,它的强引用会消失。
在您的代码中,SKSpriteNode
initWithTexture
方法会创建一个新的精灵工具包节点并将其返回。在函数返回时,init函数不再具有对该对象的强引用。您将initWithTexture
调用的结果保存到弱变量,因此在该语句的末尾,对该对象有 NO 强引用。它会立即释放。这就是为什么它变成零。
解决方案:将您的本地变量更改为strong。变化:
weak var backgroundNode = SKSpriteNode(texture: SKTexture(image: initialBackgroundImage!))
到
var backgroundNode = SKSpriteNode(texture: SKTexture(image: initialBackgroundImage!))
答案 1 :(得分:1)
所以弱变量意味着这个引用不会增加一个参考的计数器。如您所知,如果计数器等于零对象将被删除。你在这里做的是 - 你正在创造变量,但由于它很弱,它的计数器等于零并且它会破坏。还因为它很弱 - 当它破坏它的引用时会自动变为零值。
所以我们得到的是,在第一行你创建对象,它立即销毁,引用变为零。在第二行中,您尝试使用此变量进行一些操作,但因为它没有得到这样的异常。希望它能帮助你。
要修复此错误,只需使用
删除第一行代码即可let backgroundNode = SKSpriteNode(texture: SKTexture(image: initialBackgroundImage!))