Почему мое приложение выдает EXC_BAD_ACCESS во второй раз, когда я пытаюсь перейти без трассировки стека?

Я пытаюсь перейти от контроллера корневого представления -> контроллера игрового представления, затем отобразить сцену игрового процесса на game view controller, затем перейти к другому сценарию (игра поверх сцены), затем развернуть поиск к контроллеру корневого представления и затем повторить. Проблема заключается в том, что когда я пытаюсь перейти к контроллеру вида игры во второй раз, он выдает exc_bad_access после того, как контроллер вида игры пытается представить сценарий (геймплей). Нет трассировки стека, только exc_bad_access в первой строке приложения applelegate. Когда я запускаю инструменты с зомби, приложение не выдает никакой ошибки, оно работает как положено. Установка точки останова исключения, похоже, ничего не делает. Я не уверен, где или в чем моя ошибка.

это мой корневой контроллер вида:

class RootViewController: UIViewController {
    //view that we present

    @IBOutlet weak var MyLabel: UILabel?


    var preload = true

    override func viewDidLoad() {
        super.viewDidLoad()
        if preload {
        textures.atlas.preloadWithCompletionHandler( {
            print("finished preloading")
        })
        }
    }
    var lives: Int = 3

    @IBOutlet weak var MyStepper: UIStepper!

    @IBAction func didChangeValue(sender: UIStepper) {
        lives = Int(sender.value)
        MyLabel?.text = "lives: \(Int(sender.value).description)"
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        originalLives = lives
        enemyLives = lives
        heroLives = lives
        print("seguing")

    }

    @IBAction func goBack(unwindSegue: UIStoryboardSegue) {
        preload = false
    }

}


        //Controls a /view/ that displays scenes.
class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //initialize the scene to fill screen
        let myScene = GameScene(size: self.view.bounds.size)
        myScene.scaleMode = .AspectFill

        let theskView = self.view as! SKView
        self.view.multipleTouchEnabled = true

        // theskView.frameInterval = 2
//        
//        theskView.showsPhysics = true
//        theskView.showsFPS = true
//        theskView.showsNodeCount = true
//        theskView.showsDrawCount = true


        theskView.ignoresSiblingOrder = true

        myScene.scaleMode = .AspectFill

        myScene.size = theskView.bounds.size

        myScene.controller = self
        theskView.presentScene(myScene)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let dvc = segue.destinationViewController as? RootViewController {
        }
    }
    deinit {
        print("game view dies")
    }
}

сцены просты: это называется (с первой сцены), чтобы перейти к игре на сцене

  func gameOver(won: String) {
    self.removeAllChildren()
    let sceneToGoTo = GameOverScene()
    sceneToGoTo.won = won == "nudgit" ? true : false

    let theskView = self.view! as SKView
    theskView.multipleTouchEnabled = true

    // theskView.frameInterval = 2

    theskView.ignoresSiblingOrder = true

    sceneToGoTo.scaleMode = .AspectFill

    sceneToGoTo.size = theskView.bounds.size
    sceneToGoTo.controller = controller
    theskView.presentScene(nil)
    theskView.presentScene(sceneToGoTo)
}

и затем сцена игры проходит от прикосновения:

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        controller?.performSegueWithIdentifier("segue", sender: self)
    }

где "контроллер?" слабый вариант контроллера вида игры

Я проверил deinits: обе игровые сцены деинициализируются правильно, и gameViewController правильно деинициализируется, когда он возвращается к контроллеру корневого представления. Я в растерянности относительно того, что я мог сделать, чтобы это исправить.

0 ответов

Другие вопросы по тегам