2010-10-06 16 views
1

Je dois aller au fond avec la méthode didRecieveMemoryWarning. J'ai lu comme trente sujets sur ce sujet sur ce forum. Et chaque réponse est différente.Au fond avec didRecieveMemoryWarning

  1. Première question. Si vous libérez des objets dans didRecieveMemoryWarning ou juste les mettre à zéro? Ou les deux?

  2. J'ai lu que je devrais libérer la source de données tableView, si vous en avez une, dans la méthode didRecieveMemoryWarning. J'ai aussi lu que vous devriez juste publier IBOutlets dans cette méthode. Je suis confus, qu'est-ce qui est correct ici?

  3. Est-ce que seuls les objets que j'initie dans viewDidLoad devraient apparaître dans didRecieveMemoryWarning? Ou est-ce des propriétés que je viens d'attribuer à, par exemple: labelTitleText.text = @"Woodie Guthrie"? LabelTitleText est une propriété de mon fichier d'en-tête.

Dans mon application aujourd'hui, je libère tout (étiquettes aussie comme dans l'exemple ci-dessus) dans ma méthode dealloc. Cela ne me semble pas correct.

J'apprécierais vraiment un petit exemple de code afin qu'il soit plus facile à comprendre, c'est ce que les autres threads manquent, j'ai remarqué.

Bonne journée à tous! La fonction didRecieveMemoryWarning est appelée lorsque le téléphone manque de mémoire.

Répondre

2

L'essentiel est que vous n'avez réellement besoin de rien publier lorsque vous recevez un avertissement de mémoire. Cependant, ne rien faire augmente considérablement la probabilité qu'une application soit tuée, et cette application pourrait être la vôtre. Mais ça pourrait ne pas être. Si vous utilisez réellement toute la mémoire que vous avez allouée (par exemple, pas les images que vous pourriez recharger plus tard, etc.) alors ne faites rien (ou sauvegardez l'état important au cas où) et espérez que d'autres processus d'arrière-plan soient tués ou affamés. Plus d'applications font cela que vous ne le pensez.

Si vous avez des choses que vous pouvez publier, libérez les gros fichiers (au moins 1 page VM et plus). Libérer les petites choses (chaînes courtes, etc.) ne fera presque aucune différence quant à savoir si une application de fond est tué ou affamé.

Mettre des pointeurs (ou des objets) à zéro sans libérer de la mémoire (ou libérer des objets) est extrêmement mauvais, car cela ne fait que fuir la mémoire et augmentera la probabilité de mauvaises choses. Vous pouvez les régler à zéro après avoir libéré/libéré la mémoire/les objets.

2

Vous devez libérer toutes les ressources que vous pouvez récupérer plus tard si nécessaire. Pensez aux caches, aux objets inutilisés et à ce genre de choses.

Je crois comprendre que vous ne devez pas publier IBOutlets et autres dans didRecieveMemoryWarning, car ceux-ci sont nécessaires pour que l'application fonctionne correctement.

Vous devriez cependant les publier dans des méthodes comme viewDidUnload et bien sûr dans le dealloc comme vous l'avez indiqué. (Si vous les avez conservés à un moment donné, très probablement en utilisant une propriété)