Est-ce que addSubview de UIView conserve vraiment la vue?
J'ai couru dans une situation qui semble indiquer le contraire. Dans l'extrait de code suivant, si je supprime la ligne: auto.navigationController = nav, la racine du contrôleur de vue de ne pas s'afficher, ce qui suggère pour moi que addSubview ne pourrait pas en fait de conserver le point de vue contraire a suggéré. Une idée?
- (void)applicationDidFinishLaunching:(UIApplication *)application {
self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.testViewController];
self.navigationController = nav; //<-- if this line is removed, test view won't show up
[window addSubview:nav.view];
[nav release];
}
source d'informationauteur Boon | 2009-06-02
Vous devez vous connecter pour publier un commentaire.
Cette ligne:
ne PAS ajouter un affichage à l'écran immédiatement. Il est affiché par le système d'exploitation à l'avenir exécuter une boucle sur un éventuellement thread différent. La mise en œuvre effective, nous ne pouvons pas être sûr de.
C'est pourquoi Apple définit délégué méthodes comme viewDidAppear/viewWillAppear, sinon nous n'aurions pas besoin de nous connaître précisément lorsque ces événements se produisent.
En outre, l'ajout d'une sous-vue comme vous l'avez dit, en effet, conserve la vue. Il ne PAS toutefois conserver la vue du contrôleur ou de la manette de navigation. Depuis la manette de navigation SERA conserver tout ajout de contrôleurs de vue, nous n'avons pas à revenir avec un ivar.
Mais, votre référence à la manette de navigation doit persister au-delà de la portée de la méthode. ou en fonction de votre code, il pourrait être dealloc-ed ou d'avoir perdu sa référence.
Sorte que vous devez garder une référence à la manette de navigation avec un ivar et la définir comme suit:
Donc, même si la valeur liquidative.la vue contient un pointeur vers testViewController.la vue, l'application n'a pas de référence à la manette de navigation et, par extension, de la vue. Le résultat est un écran vide.
De le rendre plus évident qu'il n'est pas à retenir/communiqué de problème, vous êtes réellement une fuite dans la méthode suivante:
Vous avez besoin d'autorelease à équilibrer vos à retenir/communiqués par:
Donc, cela signifie que votre vue n'a jamais, jamais été désallouée tout moment vous avez couru ce code. Qui plus nous assure que votre problème est en fait un perdu de référence.
Le problème n'est probablement pas le point de vue n'est pas retenu, c'est que le contrôleur n'est pas conservé.
Sans cette ligne:
Rien n'est retenue de la manette de navigation. Il serait étrange d'avoir le point de vue survivre le contrôleur.
Cela n'a pas l'air de lika a conserver/communiqué de question pour moi. Vous affichez de ne pas s'afficher si vous commentez
self.navigationController = nav;
parce qu'alors, dans la ligne suivante,[window addSubview:self.navigationController.view]
de votre auto.navigationController propriété ne sont pas définis. Il est probablement nulle ou de crash, mais ne peux pas dire pour sûr, sans plus de code.