2015-05-01 2 views
1

То, что я хочу добиться: SEGUE от gameVC до mainmenuVC и избавиться от gameVCКак уволить и деинировать (Game) ViewController с помощью swift?

Когда приложение начинает его первый показывает главное меню ViewController с кнопкой воспроизведения, которая перетекает в gameviewcontroller. Когда пользователь нажимает на кнопку меню спрайта следующая функция в gameviewcontroller вызывается и перетекает обратно в главное меню:

func returnToMainMenu() { 

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

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

} 

Это, вероятно, не так, как это делается правильно, и я думаю, что проблема может быть , но я не мог работать иначе, потому что gameViewController.navigationViewController равен нулю.

Вот так выглядит моя раскадровка: storyboard Так выглядит использование памяти, когда приложение работает. Эти всплески/шаги происходят всякий раз, когда загружается контроллер gameview. Мне кажется, что проблема в том, что gameviewcontroller не деинируется, когда вызывается returnToMainMenu().

memory usage when app is runnung Кроме того, это никогда не будет выполнена:

deinit { 
    debugPrintln("GameViewController deinitialized") 
} 

обновление:

Я удалил эту

navController = self 

и определил NavController в returnToMainMenu так:

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

segue back to main menu все еще работает, но он по-прежнему не деинит vc

+0

Я предлагаю вам ясно, о том, что вы хотите достичь! Почему вы пишете свой собственный навигационный контроллер? Каким образом уже существующий не обладает достаточной функциональностью? – luk2302

+0

Мне нужна функция в моей игре VC, которая переходит в menuVC и избавляется от gameVC. – densmoe

ответ

3

Конечно, это будет утечка памяти.

override func viewDidLoad() { 
    navController = self 
} 

Вы просто дали себе ссылку на себя. Обычно, когда ваш vc выходит за пределы экрана, иерархия представлений больше не удерживает представление, поэтому просмотр становится деинсталлированным. Вы устанавливаете ссылку на себя так, что бы вы ни делали, она всегда будет храниться в памяти и никогда не будет обесцениваться.

+0

Я удалил ссылку и изменил returnToMainMenu() на это: func returnToMainMenu() { (view.window? .rootViewController as? UINavigationController) ?.открытьПросмотрСообщитьAnimated (false, завершение: ноль) } с тем же результатом – densmoe

0

Я понял это после просмотра лекции 8 курса stanford iOS8 (в 14:23).

Проблема заключалась в том, что я добавил ссылку на контроллер gameview в моей игре, чтобы вызвать метод returnToMainMenu() из сцены. Чтобы очистить память, все ссылки на VC должны быть установлены на nil.

Я решил это, обращаясь к навигации контроллера непосредственно из моей сцены, как это:

(scene!.view!.window?.rootViewController as! UINavigationController).dismissViewControllerAnimated(false, completion: nil) 
Смежные вопросы