Share via


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 exactes 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.

Diagnostiquer les problèmes de mémoire

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

  2. Chargez l’application sur l’appareil en choisissant l’élément de menu Exécuter > le chargement vers 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 MemoryDemo

  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 :

    Choisir l’option Show Display Settings (icône d’engrenage) et cocher la case Automatic Snapshotting

  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 d’arrêt.

  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 non-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 dans le volet

  15. Triez par taille et affichez la vue détaillée Extended Detail :

    Trier par taille et afficher la vue Extended Detail

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

    Afficher le code connexe

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 par l’application

L’article Xamarin.iOS Garbage Collection 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é.