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!)
}
...它工作正常,无一例外。为什么这两种方式不同?是否发生了某种垃圾收集?使用第二种格式并不不方便,但我很好奇我遗漏了什么不同之处。
SKScene
的camera
属性定义为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
也会创建对它的强引用)。
我在 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!)
}
...它工作正常,无一例外。为什么这两种方式不同?是否发生了某种垃圾收集?使用第二种格式并不不方便,但我很好奇我遗漏了什么不同之处。
SKScene
的camera
属性定义为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
也会创建对它的强引用)。