2017-01-10 1 views
4

У меня проблемы с утечкой с помощью GKStateMachine. Мое приложение - довольно простой код для проверки проблемы. Это GameScene:Утечки с использованием GKStateMachine в 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) 
    } 
} 

И это мое состояние:

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

Попробуйте использовать «слабую сцену var: GameScene?» В классе введения. Это устраняет утечку. Тем не менее, я действительно не нашел реальной причины этого. Существует вызов 'swift_unknowUnownedInit', который можно увидеть в Инструментах ... И я не был в настроении смотреть в источник Swift, чтобы копать то, что происходит за кулисами :) В противном случае ваш код кажется хорошим. Если 'GameScene' освобождает (скажем, при переходе к следующей сцене), то сценарий и вводный экземпляр будут освобождены должным образом (экземпляр внедрения не сохраняет сцену из-за использования ключевого слова' unowned'). – Whirlwind

+0

Кажется, что это работает. Спасибо. Теперь я собираюсь попробовать в своем исходном коде. Тот, на котором я впервые нашел проблему. – iOSTony

+0

Он не работал с моим исходным кодом. Есть что-то действительно странное. Согласно каждому сайту, я делаю все как должен. Однако нет окончательного решения. – iOSTony

ответ

0

Вы можете упростить конструктор, чтобы избежать приведения типа.

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

Как это на самом деле отвечает на вопрос? OP спросил об утечке ... – Whirlwind

+0

Это просто предложение, так как тип cast не нужен. –

+0

Я знаю ... Но это должен быть комментарий;) И этот init может быть еще короче, потому что вы можете удалить super.init(). Поскольку он является единственным инициализатором (одним назначенным инициализатором) из суперкласса и имеет нулевые аргументы, он будет вызываться автоматически. – Whirlwind

Смежные вопросы