Alors oui, je suis un gars de Java dans ce monde d'iPhone fou. Quand il s'agit de gestion de la mémoire, je n'ai pas encore une très bonne idée de ce que je fais.Comment gérer la mémoire UIViewControllers avec un contrôleur de navigation?
j'ai une application qui utilise un contrôleur de navigation, et quand il est temps de passer à la vue suivante je code qui ressemble à ceci:
UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView"
bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];
Or, selon la règle fondamentale d'Apple sur la gestion de la mémoire
vous prenez possession d'un objet si vous créez à l'aide d'une méthode dont le nom commence par « alloc » ou « nouveau » ou contient « copie » (par exemple,
alloc
,newObject
oumutableCopy
), ou si vous envoyez c'est unretain
message. Vous êtes responsable de la renonciation à la propriété des objets que vous possédez en utilisantrelease
ouautorelease
. Toute autre fois que vous recevez un objet, vous ne devez pas le libérer.
Pour moi, cela signifie que je publierai myController
, ou en lui donnant un message autorelease
. Mais, chaque fois que j'essaye de le faire, mon application finit par s'écraser alors que je pousse et ouvre les vues de la pile. Cela ne me paraissait pas normal, mais en exécutant Instruments, il prétend que je n'ai pas de fuites de mémoire.
Je ma question est
- que je fais ce droit?
- Le contrôleur de navigation prend-il en charge MyViewController, expliquant l'absence de fuite de mémoire?
- Devrais-je attribuer myController à une variable d'instance dans mon ViewController racine? Dans ce cas, il serait marqué conserver et je publierait dans la méthode dealloc de racine
Je ne faisais que mettre en contraste l'utilisation de l'autorelease avec la libération. Vous pouvez autoelease avant ou après, ce n'est pas grave, mais si vous libérez, vous devez le faire après. –