0

Salut à tous, j'ai un problème et j'aimerais avoir quelques conseils.Fuites sur le téléphone mais pas sur l'émulateur?

Je travaille sur un lecteur de document qui est composé des parties principales suivantes:

    bibliothèque
  1. zip qui décompresse le conteneur de document (Minizip)
  2. bibliothèque xml qui analyse le document (libxml2)
  3. Code d'interface utilisateur qui affiche le document à l'écran

Rien de trop compliqué ou de fantaisie.

Sur l'émulateur, tout fonctionne parfaitement; le spectateur fonctionne comme prévu. Je l'ai testé avec des instruments et il n'y a pas de fuites. ObjectAlloc signale environ 5,5 Mo alloués sur la durée de vie de la visionneuse (c'est l'ouverture répétée de mon document de test à plusieurs reprises).

Malheureusement sur l'appareil (iPhone 3G, iOS 3.1.2) les choses ne sont pas aussi claires. Assez fréquemment, l'ouverture répétée du fichier de test provoque une erreur de mémoire insuffisante et l'ouverture du fichier échoue. L'ouverture initiale du fichier fonctionne toujours. Même si le test de l'émulateur n'a mis en évidence aucune fuite et que l'empreinte mémoire globale était modeste, je suis obligé de conclure qu'il y a effectivement une fuite sur l'iphone (car pourquoi une ouverture répétée provoquerait une erreur de mémoire).

J'ai essayé d'exécuter des instruments sur l'appareil, mais l'application se bloque (?!) À mi-chemin de la course, donc je n'ai pas réussi à faire fonctionner les fuites.

Je crois qu'il y a une fuite importante quelque part qui n'apparaît que sur l'appareil. Donc, il me reste deux options (sans ordre particulier):

  • Refactorisez mon code de manière à éviter d'utiliser la bibliothèque zip. Cela éliminerait une source potentielle de fuites. Cela prend du temps et n'est pas concluant.
  • Reformatez et réinstallez tout sur mon téléphone (il y a peut-être quelque chose qui pose problème ici). Assez comme ci-dessus, prend du temps et suce perdre mes données de téléphone. Peut-être que ça va me permettre de lancer des fuites.

Comme vous pouvez le voir, j'atteins ici. Y a-t-il quelque chose d'évident qui me manque?

Merci d'avance les gars.

Répondre

1

Peut-être, vous devriez essayer de ne pas exécuter les fuites, mais les instruments d'allocation sur votre appareil, et de rechercher des fuites avec (manuellement)? + (Peut-être que cela semble stupide) Supprimer l'application de l'appareil et répéter Clean-Build-Run avec des fuites (pourquoi pas?).


À propos de la recherche de fuites manuelles. Lancez simplement l'instrument Allocations et, tout en utilisant votre application, effectuez chaque action plusieurs fois (par exemple, appuyez deux fois ou plus sur le bouton, naviguez jusqu'à un certain panneau et revenez plusieurs fois, etc.). La mémoire ne devrait augmenter significativement qu'une seule fois ou augmenter à l'action commencer et diminuer à la fin de l'action (bien sûr, certaines divergences sont possibles, mais elles devraient être reflétées avec de petites quantités de mémoire). Vous le verrez sur le graphique.Faites aussi des tas (dans le panneau de gauche d'Instruments quand Allocations Instrument est sélectionné, il y a un bouton pour cela) - ils vous aideront à détecter les objets "encore vivants" qui ont été considérés comme détruits (il y aura beaucoup d'objets , mais la première et la plus simple étape consiste à vérifier les objets de vos propres classes).

+0

Voulez-vous dire "ObjectAlloc"? Et que voulez-vous dire en les recherchant manuellement? Merci pour les suggestions! – EightyEight

+0

Hmm, je le pense. Mais dans mes Instruments (dans le menu de sélection des instruments) et dans mon XCode (Menu principal: Exécuter -> Exécuter avec l'outil Perfomance), il s'appelle "Allocations". Et sur la recherche manuelle - voir ma réponse (je l'ai édité pour ajouter des détails). – kpower

Questions connexes