Жонглирование несколькими UINavigationController с помощью App Delegate и обеспечение правильного отключения UINavigationController

У меня есть приложение, которое использует два 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 освобождаться :)

7
задан Smikey 20 November 2010 в 15:03
поделиться