2

J'utilise Instruments avec l'instrument Allocations. Je ne teste qu'une interaction fixe avec mon application.iPhone: Instruments Allocations en augmentation constante

J'ai un contrôleur de navigation qui va en profondeur 4 étapes. Les deux premières étapes sont des contrôleurs de vue de table standard et les deux derniers sont des contrôleurs personnalisés avec des images chargées dynamiquement.

Alors je lance mon application dans les instruments (via Run avec outil de performance -> Allocations) et faire les interactions suivantes:

1. App Loads 
2. I wait a bit until allocations graph stabilizes 
3. I tap/push into my navigation controller until the deepest level. 
4. I wait for the images to load and for the allocations graph to stabilize. 
5. I tap back out of the navigation controller until I'm back to the root level. 
6. I wait for the allocations graph to stabilize. 
7. GOTO 3. 

Maintenant que je l'ai remarqué est que, entre chaque itération de 3 à 7 la Le graphique des allocations montre une valeur légèrement plus élevée. Ainsi, les allocations globales augmentent même si je fais la même chose et que tous les deallocs du contrôleur de vue sont appelés.

Ainsi, la chronologie ressemble à peu près comme ceci:

1. Start: 1mb 
2. Push controllers/Load images: 4mb 
3. Pop controllers: 1.1mb 
4. Push controllers/Load images: 4.1mb 
5. Pop controllers: 1.2mb 
6. ... etc ... (always increasing slightly) 

Donc ma question est ce que cela signifie que j'ai une fuite ou est-ce normal? En outre, que représentent réellement les données du graphique d'allocation? Et pourquoi la valeur augmente-t-elle même si je reviens à l'état initial? Je suis inquiet que si mon application fonctionne assez longtemps, elle consommera trop de mémoire, même si tout ce que fait l'utilisateur est de pousser et d'ouvrir les contrôleurs de vue.

Toutes les pensées seraient utiles.

Répondre

0

Vous avez probablement une fuite. Vérifiez l'instrument de fuite qui peut vous aider à les trouver.

+0

Merci pour la suggestion. Vous avez raison, en utilisant les instruments de fuite, j'ai découvert 3 fuites dès le départ. Je vais devoir creuser pour voir ce qui se passe exactement. – nebs

+0

Si vous avez un contrôleur de vue que vous appuyez sur, puis sur pop, l'utilisation de la mémoire doit-elle être exactement la même qu'avant la première utilisation? ou est-ce normal qu'il monte ~ .2mb? –

0

Oui, il s'agit d'une fuite. Un de vos contrôleurs de vue le long de la ligne manque quelque chose.

0

Si vous chargez des images, il est possible que vous utilisiez [UIImage imageNamed:] qui provoque la mise en mémoire cache du système et peut être à l'origine de votre utilisation de la mémoire. Mais en bref oui, vous avez une fuite.

+0

Bon point. Bien que le chargement de l'image auquel je faisais référence n'utilise pas imageNamed, j'utilise en fait imageNamed pour ma cellule de tableau personnalisée et les images d'arrière-plan des boutons. Mais je ne pense pas que cela contribue à l'augmentation globale des allocations.Puisque imageNamed met en cache les images, cela n'éviterait-il pas d'avoir à les recharger sur les push/pops suivants? Ou est-ce que ça marche différemment? – nebs

+0

Je suis assez sûr que la fuite imageNamed a été corrigé – cobbal

1

Est-ce que c'est dans le simulateur ou sur l'appareil?

Comme il est bon de vérifier qu'un problème existe sur le périphérique, car certaines bibliothèques système libèrent de la mémoire plus souvent sur le périphérique que dans le simulateur.

Si les fuites ne montrent rien, c'est parce que vous avez toujours une référence à la mémoire quelque part, même si vous ne le pensez pas. Pour aider à dépister cela, mettez en évidence une petite partie du graphique où la mémoire augmente, et sélectionnez «créé et toujours vivant». Maintenant vous pouvez voir juste la mémoire allouée, et commencer à traquer juste où le problème est.

+0

C'est dans le simulateur. Merci pour la suggestion. Il se avère que j'ai une fuite, en fait. Je vais devoir creuser un peu plus loin pour voir où exactement. – nebs

1

Si vous possédez le tout dernier kit de développement logiciel pour iPhone, la version d'Instruments qu'il contient (2.7 je crois) possède une fonctionnalité HeapShot. Vous pouvez regarder quelques-unes des vidéos de la WWDC '10 pour plus d'informations, mais essentiellement vous prenez une photo la première fois que vous faites apparaître des contrôleurs, et encore une fois quand vous faites une deuxième apparition. Il vous montrera les allocations de mémoire qui sont différentes aux deux moments.

+0

Ouais j'utilise le nouveau SDK et les instruments 2.7. Cela ressemble à une fonctionnalité cool, je vais déf. vérifier, merci. – nebs

+0

La fonctionnalité Heap Shot ressemble à ce qui est nécessaire pour ce type de comportement de mémoire. Je l'ai déjà utilisé pour résoudre un problème similaire. –

Questions connexes