Question

Nous approchons de la fin du développement d’une application pour iPhone et je me demande à quel point il est mauvais d’utiliser Autorelease lors du développement pour iPhone. Je suis confronté à des plantages assez aléatoires et, pour l’instant, je ne peux le localiser que par une utilisation de la mémoire négligée.

En tant que débutant dans Cocoa, je me souviens d’avoir lu au début un document de recommandation qui recommandait fortement d’éviter la libération automatique au profit de la rétention / libération manuelle pour iPhone. Cependant, un développeur de cacao plus expérimenté est arrivé tôt (qui a ironiquement été licencié depuis), qui a utilisé autorelease partout. Certes, je suis allé dans "Monkey See Monkey Do". mode, et il semble revenir me hanter (je suis maintenant le seul développeur du projet).

Alors, que faire ensuite? Il me semble que je dois brancher le code et essayer de passer et de remplacer, si possible, le code autorelease en gardant les doigts croisés pour que je ne casse pas l'application par inadvertance. Il semble que beaucoup d'appels à la bibliothèque se traduisent par des objets autoreleased, tels que stringWithFormat, et à peu près tout ce que je n'utilise pas alloc moi-même. D'autres gotchyas et / ou suggestions que je devrais rechercher? Merci gourous cacao.

Était-ce utile?

La solution

L'utilisation de release au lieu de autorelease peut améliorer l'utilisation de la mémoire dans les espaces restreints (ce qui est bien sur l'iPhone), mais cela ne va pas vous aider du tout à planter si vous ne suivez pas les règles de conservation / libération. Je voudrais lire quelques tutoriels sur la gestion de la mémoire dans Obj-C si vous êtes encore un peu confus sur ce que vous devriez faire, puis vous aider après ces plantages en utilisant le débogueur et les rapports de plantage pour savoir où vous êtes en train de libérer des objets. . Ceci et this sont deux bons endroits pour commencer.

Autres conseils

Le nombre de fois que vous allouez et dealloc vos NSAutoreleasePool est plus important que le choix autorelease ou manuel. Étant donné que la plupart des frameworks Cocoa utilisent autorelease de manière généralisée, vous devez disposer d'une stratégie de vidage de pool appropriée. Une fois que cela est en place, le choix de publier ou de autorelease devient beaucoup moins un problème.

Cela étant dit, les seuls domaines qui vous préoccupent sont les boucles étroites: allouez et libérez un NSAutoreleasePool toutes les quelques itérations pour obtenir de meilleurs résultats; et lorsque vous avez créé un autre NSThread qui n'a pas de Runloop - créez un pool et videz-le de temps en temps. Comme la plupart des applications n'allouent qu'une petite quantité de données par événement, la stratégie de UIKit consistant à allouer le pool avant la distribution de l'événement et à le publier après le retour de la distribution fonctionne très bien.

Si vous ne savez pas comment utiliser autorelease, consultez CS193p FALL 2010 sur iTunes U - > Lecture numéro 4.

Il vous apprend tout sur la gestion de la mémoire et d'autres choses du même genre (si vous sautez les 10 premières minutes environ)

Pour des raisons de performances de l'iPhone, Apple suggère de ne pas utiliser d'objets libérés automatiquement, dans la mesure du possible. Libérez explicitement vos objets lorsque vous avez terminé.

L’utilisation de pools autorelease signifie que vous pouvez laisser de la mémoire inutilisée. Etant donné que l'iPhone a moins de mémoire vive, vous pourriez améliorer les performances si vous libérez de la mémoire inutile au plus tôt, au lieu de le laisser prendre le temps de consommer des ressources en attendant une libération automatique.

Lorsque vous autorisez la publication automatique, vous dites en gros: "Je n'en ai plus besoin, mais tout le monde est libre de le récupérer (avant que le pool de relâchement automatique ne soit vidé)". Lorsque vous supprimez explicitement un objet, vous dites: "Je n'en ai plus besoin et à moins que quelqu'un d'autre n'ait déjà dit autre chose (acquis), il devrait être désalloué immédiatement."

Par conséquent, autorelease n’est normalement pas la mauvaise chose à faire. Cela est nécessaire lorsque vous souhaitez renvoyer des objets à l'expéditeur d'un message sans que celui-ci ait à s'occuper de la libération de l'objet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top