2010-07-19 4 views
3

Je suis sur le point de terminer la sortie de mon application et j'essaie d'utiliser des instruments pour corriger les fuites de mémoire.Pourquoi ai-je des fuites de mémoire à l'aide d'instruments sur l'appareil mais pas sur le simulateur?

Comment se fait-ce que je peux repérer une fuite de mémoire lors de l'utilisation des instruments et mon appareil, mais pas quand je suis en utilisant le simulateur iPhone? Je comprends que c'est une question de haut niveau, mais je ne pense pas que l'affichage de code aiderait de toute façon (un peu de code ...).

Et est-il possible d'obtenir des instruments pour pointer vers le code source où il pense que la fuite est? Je peux le faire en utilisant le simulateur, mais il semble que ça ne marche pas quand on l'utilise pour le périphérique (les objets sont représentés par l'adresse (je suppose) en l'exécutant pour le simulateur il voit quel objet il est, ?)

Merci d'avance!

Cordialement, Niklas

Mise à jour: pourrait-il avoir quelque chose à voir avec ce que Mac OS X est d'avoir la collecte des ordures automatique, mais iOS ne fonctionne pas?

Répondre

7

Ne faites confiance qu'au dispositif. C'est ce que votre utilisateur utilisera pour exécuter votre application.
Ne faites pas confiance au simulateur.
Comme une démonstration de cela, j'ai juste intentionnellement ajouté une fuite à un projet. La fuite n'a pas été détectée dans le simulateur, mais s'est révélée comme prévu sur l'appareil.
Le simulateur est juste cela: un simulateur. Il peut être utile de travailler plus rapidement, mais ne remplace jamais l'appareil.

Une fois que Instruments vous a montré un objet qui a fui, vous pouvez double-cliquer dessus. Il montrera la partie de votre code responsable de la fuite. Cela fonctionne pour le simulateur et l'appareil.
Lorsque vous compilez pour le périphérique, assurez-vous que vous êtes en mode débogage (et que les paramètres de ce mode ont conservé tous vos symboles).



Un peu plus astuce que vous pourriez trouver utiles:

Pour une session plus fluide, désactivez les « Fuites automatiques Contrôle », et appuyer manuellement sur le bouton « Vérifier les fuites éventuelles maintenant » le cas échéant.

La commande « Créer et analyser » fera un travail fantastique pour vous aider à trouver les fuites. Ce n'est pas (totalement) magique, donc il ne trouvera pas toutes les fuites. Par exemple, iVars leaked ne sera pas identifié. Mais pour la portée d'une méthode, c'est juste génial.
Je recommande fortement d'activer l'indicateur "Run Static Analyzer" dans vos paramètres de construction (ou seulement pour le mode Release si vous avez une machine lente à compiler).

Si vous voulez plus d'informations sur la façon d'utiliser des instruments pour détecter les fuites, lisez ce doc d'Apple: Instruments User Guide: Built-in Instruments et Instruments User Guide: Viewing and Analysing Trace Data > Looking for Memory Leaks
Vous pouvez également regarder la vidéo des sessions liées WWDC.
Si vous ne comprenez toujours pas d'où provient votre fuite, il est temps de (re) lire le code Memory Management Programming Guide.

Nous vous remercions de vouloir expédier une application sans fuite. Avec iOS 4, c'est plus important que jamais.

+0

Merci pour votre réponse! J'ai déjà utilisé Build and Analyze, cela m'a aidé à trouver des fuites. Mais, comme "trop" souvent, vous corrigez quelque chose et un autre problème disparaît. Je nettoyais juste le code (principalement NSLogs et commentaires) et puis la fuite de mémoire était partie ... Et tout le monde n'essaye-t-il pas de réparer les fuites de mémoire ...? (Vous n'êtes pas obligé de répondre à cette question ...;)) – Nicsoft

0

Si vous ne prenez pas déjà un oeil à l'option pratique « Construire et analyser » dans le menu de construction. Il fonctionnera l'analyseur statique qui fait généralement un excellent travail. Si rien ne se présente, vous devriez peut-être revoir les vidéos de la session WWDC sur Instruments.

Il n'y a pas de substitut pour le profilage sur le matériel et avec le débogueur et instruments connecté, vous pouvez obtenir tout ce que vous le feriez dans un contexte de simulateur.

+0

Merci pour votre réponse. J'ai fait la construction et l'analyse, cela m'a aidé un peu mais aussi marqué certaines activités "inutiles" (comme quand allouer un nouvel objet varible dans une clause if où la variable réelle est définie avant la clause if. return [variable autorelease] ". Il sera certainement alloué avant.). – Nicsoft

Questions connexes