2017-01-10 6 views
4

Je rencontre des problèmes de fuite avec GKStateMachine. Mon App est un code assez direct pour tester le problème. Ceci est le GameScene:Fuites utilisant GKStateMachine dans GameplayKit

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

Et voici mon état:

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

Le problème est que quand je lance le débogueur Fuites, j'ai reçu une fuite dès que je rentre à l'Etat. Est-ce que quelqu'un a une suggestion?

+1

Essayez d'utiliser 'scene var faible: GameScene?' Dans la classe Introduction. Cela supprime la fuite. Pourtant, je n'ai pas vraiment trouvé la vraie cause de cela. Il y a un appel 'swift_unknowUnownedInit' qui peut être vu dans Instruments ... Et je n'étais pas d'humeur à regarder dans Swift source pour creuser ce qui se passe dans les coulisses :) Sinon, votre code semble bon. Si 'GameScene' se désaffecte (par exemple lors de la transition vers la scène suivante), la scène et l'instance d'introduction seront désallouées correctement (l'instance d'introduction ne conserve pas la scène en raison de l'utilisation du mot clé' unowned'). – Whirlwind

+0

Cela semble fonctionner. Je vous remercie. Maintenant, je vais essayer dans mon code d'origine. Celui où j'ai trouvé le problème au départ. – iOSTony

+0

Cela n'a pas fonctionné sur mon code d'origine. Il y a quelque chose de vraiment étrange. Selon chaque site, je fais tout comme il se doit. Cependant, il n'y a pas de solution définitive. – iOSTony

Répondre

0

Vous pouvez simplifier le constructeur pour éviter le cast de type.

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

Comment cela répond-il réellement à la question? L'OP a posé une question à propos de la fuite ... – Whirlwind

+0

C'est juste une suggestion puisque la distribution de type n'est pas nécessaire. –

+0

Je sais ... Mais cela devrait être un commentaire;) Aussi, init pourrait être encore plus court car vous pouvez supprimer super.init(). Comme c'est le seul initialiseur (un seul initialisateur désigné) d'une superclasse et qu'il a zéro argument, il sera appelé automatiquement. – Whirlwind