2016-06-22 18 views
3

iOSアプリケーションでSpriteKitを使用し、オーバーライドされたdidMoveToViewメソッドのSKSceneのcameraプロパティを初期化しようとしています。私はちょうどので、同じようにそれを初期化する場合:SpriteKit SKCameraNode - 割り当て直後の任意の値をアンラップするときのNil

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!) 
} 

を...それは例外で、正常に動作しません。なぜこれらの2つの方法が異なるのですか?ガベージコレクションが起こっていますか? 2番目のフォーマットを使用するのに不便はありませんが、それは私が見逃していることとは何か違っています。

+0

最初のケースでカメラを宣言する方法を教えてください。 – H4Hugo

+0

これは、SKScene(ここでは 'self'はSKSceneサブクラスを参照します)の' camera'オプション変数を初期化でき、その参照がカメラオブジェクトをガベージコレクションから保護すると仮定しました。 'self.camera'はSpriteKit内のSKSceneファイルで宣言されています。 – jaxuru

答えて

3

SKScenecameraプロパティがweak次のように定義されます

weak public var camera: SKCameraNode? 

そのため、ARCは、それへの強い参照(Swift uses ARC、ないガベージコレクションを)持っていない任意のインスタンスを解放しますと - できるだけ早くSKCameraNode()を割り当てると割り当てが解除され、したがってnilになります。その後、クラッシュの原因となるラップ解除を実行します(always avoid doing)。あなたはそれへの強い参照が(addChildも作成されることに注意して存在している間、したがって、割り当てが解除されるのを防ぐ、あなたの

let camera = SKCameraNode() 

宣言を通して、あなたのカメラのインスタンスへの強い参照を持っているよう

あなたの第二の例では動作しますそれに対する強い参照)。

関連する問題