2010-08-25 6 views
3

Je me demande si quelqu'un peut m'aider en ce qui concerne la gestion de la mémoire dans le code ci-dessous. Je suis particulièrement intéressé par rootController, il ne se conserve quand je fais initWithRootViewController ou le fait à la place (qui est je pense) se conservé avec fenêtre addSubview: Je suis juste curieux de savoir ce qui se passe ...Conserver rootViewController?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    Base_TableViewController *rootController = [[Base_TableViewController alloc] init]; 
    navController = [[UINavigationController alloc] initWithRootViewController:rootController]; 
    [window addSubview:[navController view]]; 
    [window makeKeyAndVisible]; 

    [rootController release]; 
    return YES; 
} 

- (void)dealloc { 
    [navController release]; 
    [window release]; 
    [super dealloc]; 
} 

EDIT:

Donc essentiellement le code ci-dessus est correct, la version en bas annule l'alloc en haut, "rootController" est conservé par navController?

Merci beaucoup, très apprécié.

Gary

Répondre

3

Après l'appel à alloc init, le conserver sur le nombre rootController sera un. Si navController fait un message dans son message initWithRootViewController, alors après cette ligne, il aura un nombre de retenue de deux (je suis assez sûr que UINavigationController conservera son contrôleur de vue racine). L'ajout de la vue de navController à la fenêtre n'affecte pas le nombre de rétention du rootController (il incrémente le compte de retenue sur le membre UIView de navController).

Après la version de rootController, le compte de retenue sera réduit à un.

Modifier

Yep. En fait, vous pouvez simplifier un peu plus le code en supprimant le déclencheur en bas et en collant un autorelease autour de l'allocation initiale.

+0

Etes-vous sûr que la fenêtre ne le conserve pas? UIView conserve ses sous-vues et UIWindow est une sous-classe de UIView, il en va de même. – Toastor

+0

Oui. AddSubview incrémentera simplement le nombre de retain sur le membre de vue du navController. Cela n'affectera pas le nombre de retenue sur le contrôleur de vue. – RedBlueThing

+1

Vous avez raison. Comment dites-vous en anglais quand vous lisez quelque chose mais votre esprit se souvient d'autre chose? :) Je n'ai pas vu qu'il appelait le contrôleur pour retourner sa vue. Ma faute! – Toastor

3

initWithRootViewController: conserve rootController. Et addSubview: conserve navController.view

EDIT: Oui, cela est vrai. Et [release rootController] ne libère pas réellement rootController, il décrémente simplement son nombre de retainer de un, puisqu'il est déjà conservé par initWithRootViewController.