У меня есть приложение, которое использует два UINavigationController - один для системы меню и один для самой игры. В моем appDelegate объявлен общий UINavigationController. Когда приложение загружается, оно загружает либо меню, либо UINavigationController игры. И, конечно же, игрок может затем перемещаться между ними.
При переходе из меню в игру я создаю новый UINavigationController и представляю его следующим образом:
GameViewController *rootController = [[GameViewController alloc] init];
UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:rootController];
[rootController release];
newNavController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:newNavController animated:YES];
[newNavController release];
Однако я заметил, что когда я это делаю, меню' s viewController никогда не вызывает dealloc. Предположительно потому, что все еще есть ссылка на то, что поддерживает его жизнь. Я обнаружил, что когда я явно устанавливаю UINavigationController делегата приложения на новый контроллер навигации (перед выпуском нового navController), он освобождает меню. Я делаю это следующим образом:
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.navController = newNavController;
[newNavController release];
Это хорошая практика? Однако я обнаружил, что при переходе из игры обратно в меню этот трюк, похоже, не работает. То есть
MainMenuViewController *menuViewController = [[MainMenuViewController alloc] init];
UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:menuViewController];
[menuViewController release];
newNavController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:newNavController animated:YES];
//Setting the appDelegate's navController to the new navController allows the menu to dealloc.
//This must happen AFTER the newNavController has been loaded.
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.navController = newNavController;
[newNavController release];
никогда не вызывает Dealloc в главном ViewController игры. И когда я снова возвращаюсь к игре, основной ViewController меню тоже больше не выпускается.
Я что-то упускаю при манипуляциях с UINavigationControllers?
Спасибо,
Майкл
РЕДАКТИРОВАТЬ: С тех пор я понял, что причина, по которой основной ViewController моей игры не работает, потому что у меня есть несколько NSTimers, которые я не аннулировал! Тем не менее, мне все еще любопытно узнать, верен ли мой вышеупомянутый подход и что явное переопределение navController в делегате приложения - это правильный способ разрешить разным UINavigationController освобождаться :)