2010-04-22 3 views
0

J'essaie de suivre la recommandation d'Apple de gérer les avertissements de faible mémoire (trouvés dans la session 416 de vidéos WWDC 2009) en libérant les ressources utilisées en libérant mon objet dataController (référencé dans mon délégué app) qui contient un grand nombre de chaînes pour la lecture d'un plist:la libération ne libère pas de mémoire en condition de mémoire faible

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 
    [_dataController release]; 
    _dataController = nil; 
    NSLog([NSString stringWithFormat:@"applicationDidReceiveMemoryWarning bottom...  retain count:%i", [_dataController retainCount]]); 
}  

Mais quand je lance ObjectAlloc dans les instruments et simulent une faible mémoire Condition, je ne vois pas une diminution de la mémoire utilisée par mon application même si je vois les instructions NSLog écrites et le nombre de retenue est nul pour l'objet. Je transmets des références au délégué de l'application à certains des contrôleurs de vue. Mais le code ci-dessus libère la référence à l'objet _dataController (contenant les données de plist) donc je m'attendrais à ce que la mémoire soit libérée.

Toute aide serait appréciée.

Répondre

1

Etes-vous sûr que le délégué de l'application est le seul propriétaire de _dataController? -release ne fait que diminuer le nombre de ref, il ne libérera pas l'objet à moins que le nombre de ref ne tombe à zéro.

Si _dataController appartient également à d'autres objets, envoyez-leur un message pour le libérer.

0

Je revérifie cela. Merci pour la contribution! J'ai relu les documents de gestion de la mémoire d'Apple et j'ai mis une instruction NSLog dans la méthode dealloc de mon DataController et elle est appelée. J'ai également mis en écriture le nombre de retain avant la publication et la mise à zéro de _dataController. Le nombre de retenue est 1.

Cela me ramène à pourquoi je ne vois pas une diminution significative de l'utilisation de la mémoire. Je pense que je dois mieux comprendre l'affichage ObjectAlloc dans Instruments et où les plus grandes allocations de mémoire ont lieu dans mon application. Après avoir cherché de l'aide dans ce domaine, je suis frustré d'essayer de déterminer à partir d'Instruments où cela se produit. Je peux voir qu'il y a 3.54 MB pour "All Allocations" et 608 MB pour Malloc 32.00 KB. Si je descends sur Malloc, je ne vois que l'appelant responsable comme étant des appels de structure comme png_malloc et inflateEnd. Je cherche des appels dans mon code qui est responsable de Malloc mais je ne vois pas cela. Tout cela pour dire que je me demande si je libère l'objet ou les objets qui vont vraiment faire une différence significative dans la quantité de mémoire utilisée pour la condition de faible mémoire. Je pense que j'ai besoin d'un tutoriel en profondeur pour les instruments. Les doc d'aide d'Apple sont correctes mais un exemple avec du code serait plus utile.

Questions connexes