2017-01-10 4 views
4

GKStateMachineにリークの問題があります。 私のアプリケーションは、問題をテストするためのまっすぐなコードです。これはGameSceneです:GameplayKitでGKStateMachineを使用したリーク

import SpriteKit 
import GameplayKit 

class GameScene: SKScene { 

    lazy var gameState:GKStateMachine = GKStateMachine(states: [Introduction(scene: self)]) 

    override func didMove(to view: SKView) { 

     self.gameState.enter(Introduction.self) 
    } 
} 

そして、これは私の状態です:

import SpriteKit 
import GameplayKit 

class Introduction: GKState { 

    unowned let scene:GameScene 

    init(scene:SKScene) { 
     self.scene = scene as! GameScene 
     super.init() 
    } 

    override func didEnter(from previousState: GKState?) { 
     print("INSIDE THE Introduction STATE") 
    } 
} 

問題は、私はリークデバッガを実行したとき、私はできるだけ早く私は状態に入るように、1つの漏れを受けたということです。誰か に提案がありますか?

+1

Introductionクラスで 'weak var scene:GameScene? 'を使ってみてください。それは漏れを取り除く。それでも私は本当の原因を見つけていません。インストゥルメントで見ることができる 'swift_unknowUnownedInit'呼び出しがあります。そして、私はSwiftソースを調べて、何が起こっているのかを調べる気がしませんでした:)そうでなければ、あなたのコードは良いようです。 'GameScene'が(次のシーンへの移行時に)割り当てを解除すると、シーンと導入インスタンスは適切に割り当て解除されます(導入インスタンスは' unowned'キーワードの使用によりシーンを保持しません)。 – Whirlwind

+0

それは動作するようです。ありがとうございました。今私は元のコードを試してみるつもりです。私が問題を最初に見つけた場所。 – iOSTony

+0

元のコードでは機能しませんでした。本当に奇妙なことがあります。すべてのウェブサイトによると、私はそれがすべきであるすべてをやっています。しかし、決定的な解決策はありません。 – iOSTony

答えて

0

コンストラクタを単純化して、型キャストを避けることができます。

init(scene: GameScene) { 
    self.scene = scene 
    super.init() 
} 
+0

これは実際にどのように質問に答えますか? OPはリークについて尋ねました... – Whirlwind

+0

タイプキャストが不要なので、単なる提案です。 –

+0

私は知っています...しかし、それはコメントでなければなりません;)あなたがsuper.init()を削除することができるので、initももっと短くなるかもしれません。それはスーパークラスからの唯一のイニシャライザ(指定された単一の初期化子)であり、引数がゼロであるため、自動的に呼び出されます。 – Whirlwind

関連する問題