2010-08-24 6 views
11

Je me bats pour savoir si pushViewController conserve le contrôleur, actuellement j'ai le code suivant (qui fonctionne) ...PushViewController conserve-t-il le contrôleur?

ColorController *colorController = [[ColorController alloc] initWithNibName:nibColor bundle:nil]; 
[[self navigationController] pushViewController:colorController animated:YES]; 
[colorController release]; 

mais je envisage de retirer la libération et l'ajout d'un autorelease ...

ColorController *colorController = [[[ColorController alloc] initWithNibName:nibColor bundle:nil] autorelease]; 
[[self navigationController] pushViewController:colorController animated:YES]; 

beaucoup apprécié

Gary

+0

J'utiliserais 'release' ici puisque vous savez que vous avez terminé avec' colorController' et 'UINavigationController # pushViewController: animated' retient' colorController'. Mais, 'autorelease' fonctionne aussi. – ma11hew28

Répondre

11

Cela ne fait rien ...

ColorController *colorController = [[ColorController alloc] initWithNibName:nibColor bundle:nil]; 
[[[self navigationController] pushViewController:colorController animated:YES] autorelease]; 

Vous autoréléez la valeur de retour de pushViewController: animated :, qui est vide.

Votre premier extrait est valide et correct. pushViewController: conserve en effet le contrôleur qui est poussé. Editer: Dans votre code mis à jour, il y a peu de différence entre les deux échantillons. Les deux maintiennent des comptes de retenue appropriés. Cependant, il est conseillé d'éviter d'utiliser autoRelease sauf si nécessaire (en particulier dans une zone sensible à la mémoire, comme l'iPhone). Cela permet à votre application de conserver une empreinte mémoire plus prévisible et gérable.

+0

Merci, désolé encore une fois de laisser tomber la autorelease sur la mauvaise ligne. Juste ce que j'étais après. – fuzzygoat

+0

Typos arriver, je voulais juste m'assurer que ce n'était pas intentionnel! haha. –

+0

Il est également recommandé de préférer autorelease pour éviter les erreurs de codage. Lequel choisissez-vous? Bien, si Instruments vous dit que autorelease prend une quantité importante de CPU ou de mémoire, alors vous pouvez utiliser des appels de libération explicites. Mais c'est très improbable. –

0

C'est sûr. Chaque fois que vous donnez un objet à un autre objet SDK comme celui-ci, il sera conservé. Bien que cette deuxième ligne n'est pas autoreleasing ce que vous pensez. Habituellement, vous voulez le autorelease sur la même ligne que le init à des fins de clarté.

ColorController *colorController = [[[ColorController alloc] initWithNibName:nibColor bundle:nil] autorelease]; 
[[self navigationController] pushViewController:colorController animated:YES]; 
4

Oui, le contrôleur de vue est conservé.

Il n'y a pas de grande différence entre les deux blocs de code que vous avez affichés (au moins la version que je regarde - d'autres personnes ont probablement vu une version antérieure avec un appel mal placé à autorelease). Vous pouvez utiliser l'un ou l'autre. C'est une question de style.

+0

Merci Shaggy Frog, très apprécié. – fuzzygoat

0

Si vous voulez essayer, vous devriez essayer cette

id temp = [self.navigationController.viewControllers objectAtIndex:1]; 
[self.navigationController popToViewController:temp animated:YES]; 

vous serez naviguiez à tout autre ViewController précédent qui sont disponibles dans la pile.

Questions connexes