2009-02-25 9 views
1

est ici un getter hypothétique:question iPhone concernant la gestion de la mémoire

- (DetailViewController *)detailController 
{ 

    if (detailController == nil) { 
     DetailViewController *controller = [[DetailViewController alloc] initWithNibName:@"Detail" bundle:nil]; 
     self.detailController = controller; 
     [controller release]; 
    } 

    return detailController; 
} 

Ensuite, le code qui l'appelle ressemble à quelque chose comme:

- (void)loadControllerOrSomething 
{ 
    DetailViewcontroller *controller = self.detailController; 
    [navigationController doSomethingWith:controller]; 
} 

Ma question concernant la gestion de la mémoire est le suivant. Si je laisse le contrôleur sortir du cadre ici, dans loadControllerOrSomething, est-ce que je perds de la mémoire? Dois-je faire un contrôleur = nul après avoir travaillé avec navigationController?

Répondre

3

Non, vous ne fuirez rien.

Aucune conservation supplémentaire n'a été ajoutée au contrôleur avant qu'il ne soit renvoyé et aucune retenue n'a été ajoutée lors de sa réception. Si vous avez besoin de garantir son existence en dehors du cadre de vos fonctions, vous devez appeler retenez-le et relâchez lorsque vous avez terminé.

C'est généralement ainsi que la gestion de la mémoire fonctionne dans Cocoa. Lorsqu'un objet est renvoyé par une fonction, vous n'avez aucun droit de propriété. À moins que vous n'appeliez «conserver», il sera supprimé lorsqu'il atteindra la fin de son cycle de vie naturel, qui pourrait être l'image suivante, la minute suivante, etc.

Les exceptions avec des noms contenant 'alloc' ou 'copy' et qui retournent un nouvel objet sont des exceptions. Vous êtes responsable de l'appel de la version quand ils ne sont plus nécessaires.

Questions connexes