简体   繁体   中英

How to both dismiss and deinit a (Game)ViewController using swift?

What I want to achieve: segue from gameVC to mainmenuVC and get rid of the gameVC

When the app starts it first shows a main menu viewcontroller with a play button that segues to the gameviewcontroller. When the user taps on a menu button sprite the following function in the gameviewcontroller gets called and it segues back to the main menu:

func returnToMainMenu () {

    //This works but does not deinit the vc
    navController?.dismissViewControllerAnimated(true, completion: nil)

    /* this does not do anything:
    navController?.popViewControllerAnimated(true)
    */

}

This is probably not how it is done properly and I think that might be the problem, but I could not get to work otherwise because gameViewController.navigationViewController is nil.

This is how my storyboard looks: 故事板 This is how the memory usage looks when the app is running. Those spikes/steps occur whenever the gameviewcontroller is loaded. It seems to me that the problem is, that the gameviewcontroller does not de-initialize when returnToMainMenu() is called.

app运行时的内存使用情况 Also, this never gets executed:

 deinit {
    debugPrintln("GameViewController deinitialized")
}

update:

I deleted this

navController = self

and defined navController in returnToMainMenu like this:

let navController = view.window?.rootViewController as! UINavigationController

segue back to main menu still works but it still does not deinit the vc

Of course it will memory leak.

override func viewDidLoad() {
    navController = self
}

You just gave yourself a reference to itself. Usually when your vc goes offscreen, the view hierarchy no longer holds the view so the view is deinited. You set a reference to itself so whatever you do, it will always hold itself in memory and will never deinit.

I figured it out after watching Lecture 8 of the stanford iOS8 course (at 14:23).

The problem was that I added a reference to the gameviewcontroller in my gamescene to call its returnToMainMenu() method from the scene. In order for its memory to be cleared all the references to the VC have to be set to nil.

I solved it by referring to the navigation controller directly from my scene like this:

(scene!.view!.window?.rootViewController as! UINavigationController).dismissViewControllerAnimated(false, completion: nil)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM