Procédure pas à pas : Utilisation de l’outil Instruments d’Apple

Cet article explique pas à pas comment utiliser l’outil Instruments d’Apple pour diagnostiquer les problèmes de mémoire dans une application iOS conçue avec Xamarin. Il montre comment lancer Instruments, prendre des instantanés du tas et analyser la croissance de la mémoire. Il explique également comment utiliser Instruments pour afficher et identifier les lignes de code précises qui sont à l’origine du problème de mémoire.

Cette page montre comment utiliser l’outil Instruments dans Xcode pour diagnostiquer un problème de mémoire dans une application iOS. Commencez par télécharger l’exemple MemoryDemo et ouvrez la solution before dans Visual Studio pour Mac.

Diagnostiquer les problèmes de mémoire

  1. À partir de Visual Studio pour Mac, lancez Instruments à partir de l’élément de menu Outils > Lancer des instruments.

  2. Chargez l’application sur l’appareil en choisissant l’élément de menu Exécuter > le chargement sur l’appareil .

  3. Choisissez le modèle Allocations (icône orange avec une boîte blanche)

    Choisir le modèle Allocations

  4. Sélectionnez l’application MemoryDemo dans la liste Choose a profiling template for: en haut de la fenêtre. Cliquez sur l’appareil iOS pour développer le menu qui affiche les applications installées.

    Sélectionner l’application de démonstration de la mémoire

  5. Appuyez sur le bouton Choose (en bas à droite de la fenêtre) pour démarrer Instruments. Ce modèle affiche deux éléments dans le volet supérieur : Allocations et VM Tracker.

  6. Appuyez sur le bouton d’enregistrement (bouton rouge en haut à gauche) dans Instruments pour lancer l’application.

  7. Sélectionnez la ligne VM Tracker dans le volet supérieur (comme l’application est maintenant démarrée, le volet contient deux sections : Dirty et Resident Size). Dans le volet Inspector, choisissez l’option Show Display Settings (l’icône d’engrenage), puis cochez la case Automatic Snapshotting figurant en bas à droite dans cette capture d’écran :

    Choisissez l’option Afficher les paramètres d’affichage de l’icône d’engrenage, puis cochez la case Capture instantanée automatique

  8. Sélectionnez la ligne Allocations dans le volet supérieur (comme l’application est maintenant démarrée, le volet affiche All Heap and Anonymous VM)

  9. Dans le volet Inspector, choisissez l’option Show Display Settings (l’icône d’engrenage), puis appuyez sur le bouton Mark Generation pour établir une base de référence. Un petit drapeau rouge apparaît dans la chronologie en haut de la fenêtre

  10. Faites défiler l’application, puis resélectionnez Mark Generation (répétez l’opération plusieurs fois)

  11. Cliquez sur le bouton Arrêter .

  12. Développez le nœud Generation avec la plus grande valeur Growth et triez les valeurs Growth par ordre décroissant.

  13. Dans le volet Inspector, passez à la vue Extended Detail (la « E ») pour afficher la trace de pile sous Stack Trace.

  14. Notez que le <nœud sans objet> affiche une croissance excessive de la mémoire. Cliquez sur la flèche à côté de ce nœud pour afficher plus de détails. Cliquez avec le bouton droit dans la trace de pile pour ajouter l’emplacement source dans le volet :

    Ajouter l’emplacement source au volet

  15. Triez par taille et affichez l’affichage Détaillé étendu :

    Trier par taille et afficher l’affichage Détaillé étendu

  16. Cliquez sur l’entrée souhaitée dans la pile des appels pour afficher le code connexe :

    Affichage du code associé

Dans ce cas, une nouvelle image est créée et stockée dans une collection pour chaque cellule, et les cellules d’affichage de collection existantes ne sont pas réutilisées.

Résoudre les problèmes de mémoire

Il est possible de résoudre ces problèmes et de réexécuter l’application à l’aide de l’outil Instruments.

Déclarez une instance unique au niveau de la classe. De cette façon, l’image peut être réutilisée, et l’objet cellule peut être réutilisé à partir d’un pool existant au lieu d’être systématiquement créé, comme illustré ci-après :

public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
    // Dequeue a cell from the reuse pool
    var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);

    // Reuse the image declared at the class level
    imageCell.ImageView.Image = image;

    return imageCell;
}

Maintenant, la quantité de mémoire utilisée pendant l’exécution de l’application est considérablement réduite. La croissance entre les générations se mesure désormais en Kib (kilo-octets), et non plus en MiB (mégaoctets) comme c’était le cas avant de corriger le code :

Affichage de l’utilisation de la mémoire de l’application

Le code amélioré est disponible dans l’exemple MemoryDemo, dans la solution after dans Visual Studio pour Mac.

L’article Garbage Collection Xamarin.iOS est une référence utile pour traiter les problèmes de mémoire avec Xamarin.iOS.

Résumé

Cet article vous a montré comment utiliser Instruments pour diagnostiquer les problèmes de mémoire. Il vous a expliqué comment lancer Instruments à partir de Visual Studio pour Mac, charger le modèle d’allocation de mémoire et identifier les problèmes de mémoire. Enfin, l’application a été réexaminée pour vérifier que le problème a bien été corrigé.