Est-il possible de suivre l'allocation et la désallocation de mes objets Objective-C? Par exemple, si j'ai une classe Book, je veux suivre toutes les allocations et désallocations des objets de type Book. Je peux suivre toutes les classes SKD par défaut, telles que UIViewController, UIWindow, UIView, NSDictionary et tout cela, mais je veux suivre également les objets créés à partir de mes classes définies.
Vous pouvez utiliser l'instrument Allocations pour suivre le cycle de vie de vos objets. Si vous utilisez le modèle "Allocations", il est configuré pour enregistrer les événements malloc
et free
. Vous souhaiterez peut-être le configurer pour enregistrer également les événements retain
, release
et autorelease
en activant la case à cocher "Record reference count" dans les paramètres de l'instrument Allocations:
(Vous ne pouvez pas basculer cela pendant que Instruments enregistre, ce qui démarre par défaut dès que vous choisissez votre modèle.)
Mise à jour pour Xcode 9: Apple a rendu plus difficile la recherche de ces paramètres. Maintenant, vous devez sélectionner l'instrument Allocations, puis dans la barre de menus, choisissez Fichier> Enregistrement Options.
Après votre exécution, vous pouvez trouver vos objets à l'aide de la vue Allocations> Statistiques> Résumé de l'objet, qui est le paramètre par défaut du volet Détails (la moitié inférieure de la fenêtre):
Si vous souhaitez voir les objets qui ont été désalloués avant d'arrêter l'exécution, vous devez modifier le paramètre Durée de vie d'allocation de "Créé et toujours vivant" (par défaut) à "Tous les objets créés":
Pour rechercher des objets d'une classe spécifique, commencez par taper le nom de la classe dans le champ Rechercher à l'extrémité droite de la barre d'outils de la fenêtre. Recherchez ensuite le nom de la classe dans la colonne Catégorie de la vue de liste, passez la souris dessus et cliquez sur la flèche qui apparaît à côté. Par exemple, mon application a une classe nommée Tile
, donc je recherche cela, puis je clique sur la flèche à côté de Tile
dans la vue de liste:
La vue liste affiche maintenant chaque instance de Tile
. (Notez que vous devez entrer la classe réelle de l'objet, pas une superclasse. La saisie de NSObject
ne trouvera que les objets créés par [NSObject alloc]
, pas les objets créés par [Tile alloc]
.) Je peux voir l'historique d'une instance particulière en cliquant sur la flèche à côté de l'adresse de cette instance:
Dans la vue détaillée d'un objet, je peux voir les événements malloc
et free
et, puisque j'ai activé "Enregistrer les nombres de références", je peux également voir le retain
, release
et autorelease
messages et leur effet sur le nombre de retenues de l'objet. Si je veux voir la pile d'appels pour l'un de ces événements, je peux ouvrir le panneau de détail étendu sur le côté droit de la fenêtre: