Cette ligne:
[window addSubview:nav.view];
n'ajoute une vue à l'écran immédiatement. Il est affiché par l'OS dans une boucle d'exécution future sur un thread éventuellement différent. La mise en œuvre réelle, nous ne pouvons pas être sûrs de. C'est pourquoi Apple définit des méthodes déléguées comme viewDidAppear/viewWillAppear, sinon nous n'en aurions pas besoin car nous saurions précisément quand ces événements se produisent.
En outre, l'ajout d'une sous-vue, comme vous l'avez dit, conserve effectivement la vue. Il ne pas cependant conserver le contrôleur de vue ou le contrôleur de navigation. Depuis le contrôleur de navigation va conserver les contrôleurs de vue ajouté, nous ne devons pas les sauvegarder avec un ivar. Mais, votre référence au contrôleur de navigation doit persister au-delà de la portée de la méthode. ou en fonction de votre code, il pourrait être désengagé ou avoir perdu sa référence.
Vous devez donc conserver une référence au contrôleur de navigation avec un Ivar et le mettre comme ceci:
self.navigationController = nav;
Ainsi, même si nav.view contient un pointeur vers testViewController.view, l'application n'a pas de référence de la contrôleur de navigation et, par extension, la vue. Le résultat est un écran vide.
Pour rendre cela plus évident que ce n'est pas retenir/problème de libération, vous traces de fuites en fait dans la méthode suivante:
self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];
Vous devez AutoRelease pour équilibrer vos retenir/communiqués par:
self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];
donc, cela signifie que votre point de vue n'a jamais, jamais été désallouée chaque fois que vous avez couru ce code. Ce qui nous assure en outre que votre problème est en effet une référence perdue.
Votre réponse marquée n'est pas correcte, pour les raisons que j'ai commentées ci-dessous. –