SpriteKit SKCameraNode - 在分配后展开可选值时为零

SpriteKit SKCameraNode - Nil when unwrapping an optional value just after assigned

我在 iOS 应用程序中使用 SpriteKit,并尝试在覆盖的 didMoveToView 方法中初始化我的 SKScene 的 camera 属性。如果我像这样初始化它:

override func didMoveToView(view: SKView) {
    ...
    self.camera = SKCameraNode()
    self.addChild(self.camera!)
}

...它在 self.addChild 行抛出异常 unexpectedly found nil while unwrapping an Optional value,但是如果我这样做:

override func didMoveToView(view: SKView) {
    ...
    let camera = SKCameraNode()
    self.camera = camera
    self.addChild(self.camera!)
}

...它工作正常,无一例外。为什么这两种方式不同?是否发生了某种垃圾收集?使用第二种格式并不不方便,但我很好奇我遗漏了什么不同之处。

SKScenecamera属性定义为weak:

weak public var camera: SKCameraNode?

因此,由于 ARC 将释放任何对其没有强引用的实例 (Swift uses ARC, not garbage collection) – as soon as you assign SKCameraNode() to it, it will be deallocated and therefore will be nil. You then proceed to force unwrap it (which you should ),从而导致崩溃。

你的第二个例子是有效的,因为你通过你的

强烈引用了你的相机实例
let camera = SKCameraNode()

声明,因此在存在对它的强引用时防止它被释放(请注意 addChild 也会创建对它的强引用)。