web-dev-qa-db-fra.com

Les allocations d'instruments suivent l'allocation et la désallocation des objets des classes définies par l'utilisateur

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.

56
Cosmin

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:

record reference counts checkbox

(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):

Object Summary setting for Detail pane

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":

Allocation Lifespan setting

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:

Searching

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:

Getting detail

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:

extended detail of call stack

216
rob mayoff