SpriteKit SKCameraNode - 在分配后解包可选值时为Nil

时间:2016-06-22 07:37:53

标签: ios swift sprite-kit optional skscene

我在iOS应用中使用SpriteKit,并尝试在重写的camera方法中初始化我的SKScene的didMoveToView属性。如果我只是这样初始化它:

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

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

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

......它运作正常,也不例外。为什么这两种方式不同?是否有某种垃圾收集?使用第二种格式并不方便,但是我很好奇我失踪的不同之处。

1 个答案:

答案 0 :(得分:3)

camera的{​​{1}}属性定义为SKScene

weak

因此,ARC将释放任何没有强引用的实例(Swift uses ARC,而不是垃圾回收) - 只要您为其分配weak public var camera: SKCameraNode? ,它就会被解除分配,因此将SKCameraNode()。然后你继续强制打开它(你应该always avoid doing),导致崩溃。

您的第二个示例可用,因为您通过

强烈引用了相机实例
nil

声明,因此阻止它在存在强引用时被释放(注意let camera = SKCameraNode() 也会创建一个强引用)。