2009-12-03 4 views
8

J'ai un code très simple pour montrer un contrôleur modal (nextController est membre de la classe):L'utilisation dismissModalViewControllerAnimated ne libère la mémoire

nextController = [[InstructionsScreen alloc] initWithNibName:@"InstructionsScreen" bundle:nil]; 
[self presentModalViewController:nextController animated:YES]; 
[nextController release]; 

Et puis, quand le contrôleur doit cacher:

[self dismissModalViewControllerAnimated:YES]; 
nextController = nil; 

Tout fonctionne bien comme prévu, mais quand j'exécute les allocations d'objet instrument, cela montre qu'après avoir ignoré le contrôleur modal, la mémoire allouée n'est pas libérée. Cela devient un problème parce que quand je montre plusieurs contrôleurs la mémoire est terminée ...

Quelqu'un peut-il me donner quelques indices? Clang ne voit aucun problème, je suis donc bloqué par la limite de mémoire, car la mémoire des contrôleurs rejetés ne sera pas libérée.


EDIT: Ce que j'ai découvert jusqu'à présent, c'est qu'il semble être une fuite quelque part dans les affaires d'Apple. Façon de reproduire: XCode -> créer un nouveau projet avec le modèle "Application utilitaire". N'écrivez pas de code vous-même. Il suffit de créer une nouvelle application utilitaire et exécutez-le avec "Attribution d'objets", choisissez de voir "Créé & Encore vivant". Maintenant retournez le contrôleur modal plusieurs fois - vous verrez que la mémoire allouée ne cesse de croître et de se développer chaque fois que le contrôleur modal apparaît et qu'il disparaît aussi ...

Répondre

0

Les vues modales ne sont pas des sous-vues de la vue appelante mais sont plutôt sous-vue de la fenêtre des applications et sont conservés par la fenêtre elle-même. En général, vous ne conservez pas de référence dans le contrôleur qui les appelle. Au lieu de cela, évoquez la vue modale et faites-la communiquer avec le contrôleur en définissant le contrôleur en tant que délégué de la vue modale.

Je pense que si vous utilisez synthesize pour créer l'accesseur pour une propriété nextController définie avec retain, l'accesseur conservera tout objet affecté à la propriété. Définir simplement la valeur à nil ne libèrera l'objet que si l'accesseur est configuré pour le faire et je ne pense pas que les autogénérés le fassent.

Vous devrez expressément appeler le release avant de régler à zéro.

Si cela ne fonctionne pas, postez le code pour votre définition de la propriété nextController.

+1

Comme je l'ai dit, nextController est membre, pas une propriété: @interface MainScreenViewController: UIViewController { id nextController; } utilisant "release" au lieu d'attribuer à nextController "nil" conduit à une exception: le message viewDidDisappear: envoyé à l'objet libéré. L'objet semble être libéré, mais l'instrument d'allocation d'objet "créé et toujours vivant", montre seulement l'utilisation croissante et croissante de la mémoire. –

1

Il n'y a pas de fuite dans le code que vous montrez autant que je peux voir. Il pourrait être une fuite dans InstructionsScreen qui empêcherait sa désallocation.

Je pense que cela vaut la peine d'exécuter l'analyseur statique pour voir s'il détecte une fuite.

La fuite dans le code modèle Apple est intéressante. Il se pourrait qu'il y ait une fuite. Cela semble improbable mais évidemment ce n'est pas impossible. Je dirais qu'il est plus probable que ce soit un faux positif dans Instruments, et c'est pourquoi je suggère d'utiliser l'analyseur statique. (Vous pourriez vouloir faire un rapport de bogue sur la fuite.

Questions connexes