2017-01-11 14 views
1

我會告訴你我的實際代碼。它有三個要素:一個助手:在子類中使用GKStateMachine泄漏

import SpriteKit 
import GameplayKit 

class GameSceneHelper: SKScene { 

    override func didMove(to view: SKView) { 

    } 
} 

一些遊戲的狀態助手的一個子類:

import SpriteKit 
import GameplayKit 

class GameScene: GameSceneHelper { 

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

    override func didMove(to view: SKView) { 

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

和各州。在這裏,我介紹其中之一。其他具有相同的結構:

import SpriteKit 
import GameplayKit 

class Introduction: GKState { 

    weak var scene:GameScene? 

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

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

的問題是,我得到一個泄漏時,我定義GameSceneHelper的子類裏面的遊戲狀態變量。但是,如果我不使用子類,而是使GameScene成爲SKScene的直接子類,則一切正常。問題是,對於我的項目,我需要助手,所以我不能將其排除在等式之外。 有人有什麼建議嗎?

回答

1

好的。經過很多時間,我發現問題的根源。在遊戲狀態的聲明必須從GameScene移到GameSceneHelper這樣的:

class GameSceneHelper: SKScene { 

    var gameState:GKStateMachine! 

    override func didMove(to view: SKView) { 
    } 
} 

沒有用裏面GameScene的懶VAR聲明。然後一切正常。