我在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!)
}
......它运作正常,也不例外。为什么这两种方式不同?是否有某种垃圾收集?使用第二种格式并不方便,但是我很好奇我失踪的不同之处。
答案 0 :(得分:3)
camera
的{{1}}属性定义为SKScene
:
weak
因此,ARC将释放任何没有强引用的实例(Swift uses ARC,而不是垃圾回收) - 只要您为其分配weak public var camera: SKCameraNode?
,它就会被解除分配,因此将SKCameraNode()
。然后你继续强制打开它(你应该always avoid doing),导致崩溃。
您的第二个示例可用,因为您通过
强烈引用了相机实例nil
声明,因此阻止它在存在强引用时被释放(注意let camera = SKCameraNode()
也会创建一个强引用)。