2016-06-22 7 views
3

Ich verwende SpriteKit in einer iOS App und versuche, die camera Eigenschaft meines SKScene in der überschriebenen didMoveToView Methode zu initialisieren. Wenn ich es nur initialisieren wie so:SpriteKit SKCameraNode - Nil beim Entpacken eines optionalen Werts direkt nach dem zugewiesenen

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

... es wirft die Ausnahme unexpectedly found nil while unwrapping an Optional value an der self.addChild Linie, aber wenn ich dies tun:

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

... es funktioniert gut, keine Ausnahme . Warum unterscheiden sich diese beiden Wege? Gibt es eine Art Müllabfuhr? Es ist nicht unpraktisch, das zweite Format zu verwenden, das funktioniert, aber ich bin gespannt, was mich unterscheidet.

weak public var camera: SKCameraNode? 

Daher wird, wie ARC jede Instanz freigeben wird, die keinen starken Hinweis darauf hat (Swift uses ARC, nicht Garbage Collection) - so schnell wie:

+0

Können Sie uns bitte im ersten Fall zeigen, wie Sie Ihre Kamera deklarieren? – H4Hugo

+0

Das ist es, ich nahm an, dass die 'Kamera' optionale Variable in der SKScene (" self "hier bezieht sich auf eine SKScene-Unterklasse) konnte initialisiert werden und diese Referenz würde das Kameraobjekt vor Garbage Collection schützen. 'self.camera' wird in SKScene-Dateien innerhalb von SpriteKit deklariert. – jaxuru

Antwort

3

Die camera Eigenschaft SKScene als weak definiert Sie weisen ihm SKCameraNode() zu, es wird freigegeben und wird daher nil sein. Sie fahren dann fort, es auszupacken (was Sie sollten always avoid doing), was den Absturz verursacht.

Ihr zweites Beispiel funktioniert, wie Sie einen starken Bezug auf die Kamera Beispiel durch Ihre

let camera = SKCameraNode() 

Erklärung haben, daher ist es zu verhindern, dass ausgeplant, während das starke Verweis darauf vorhanden ist (beachten Sie, dass addChild wird auch ein erstellen starker Hinweis darauf).

Verwandte Themen