Comment configurer NSZombieEnabled dans Xcode 4?

456

Comment configurer NSZombieEnabledet CFZombieLevelpour mon exécutable dans Xcode 4?

Chétan
la source
1
demandez-vous à propos de Xcode 4?
Jehiah
8
Pourquoi des options comme celle-ci ne sont pas activées par défaut me dépasse ...
Daniel Magnusson
26
Parce qu'il empêche fondamentalement toute véritable libération de mémoire, ce qui ne semble pas être une bonne idée d'activer par défaut.
Chetan
14
@Daniel Magnusson: c'est une chose qui survit le mieux. En rendant le développement avec XCode inamical mais réalisable, vous obtenez de meilleurs développeurs. Je rigole.
Dan Rosenstark
3
@DanielMagnusson Je pense que ce n'est pas une mauvaise idée, AFAIK le mode "Zombie" changera chaque objet en un objet ob de type spécial afin qu'il puisse détecter, quand il reçoit des messages. Donc, si le "mode Zombie" est activé, aucun objet ne sera jamais désalloué, vous ne devriez donc vraiment l'utiliser que pour lutter contre de telles erreurs.
Besi

Réponses:

753

Dans Xcode 4.x, appuyez sur

R

(ou cliquez sur Menubar> Product> Scheme> Edit Scheme)

sélectionnez l'onglet "Diagnostics" et cliquez sur "Activer les objets Zombie":

Cliquez sur "Activer les objets zombies"

Cela transforme les objets libérés en instances NSZombie qui affichent des avertissements de la console lorsqu'ils sont réutilisés. Il s'agit d'une aide au débogage qui augmente l'utilisation de la mémoire (aucun objet n'est vraiment libéré) mais améliore le rapport d'erreurs.

Un cas typique est lorsque vous relâchez un objet et que vous ne savez pas lequel:

  • Avec des zombies: -[UITableView release]: message sent to deallocated instance
  • Sans zombies: EXC_BAD_ACCESS

Ce paramètre Xcode est ignoré lorsque vous archivez l'application pour la soumission sur l'App Store. Vous n'avez rien à toucher avant de lancer votre application.

Appuyez sur Rrevient à sélectionner Produit> Exécuter tout en maintenant la Alttouche enfoncée.
Cliquer sur la case "Activer les objets Zombie" revient à ajouter manuellement "NSZombieEnabled = YES" dans la section "Variables d'environnement" de l'onglet Arguments.

Jano
la source
27
Merci - je me demandais où ils avaient caché ces options. Je réalise maintenant que c'est la même fenêtre que dans le menu 'Edit Scheme'.
emp
1
Pour ajouter à cela, le faire dans l'écran "Exécuter" le définit également pour "Test" si la case "Utiliser les options de l'action Exécuter" est cochée. Si vous voulez le faire uniquement pour Test, cette case doit être décochée
Cameron
1
Veuillez également noter que cette option apparaît sur Xcode 4.1 (non?)
phi
2
Dans XCode 5 (et les versions ultérieures de 4 - 4.3.x pour sûr, peut-être plus tôt), c'est CMD-<( CMD-SHIFT-comma), ouProduct -> Scheme -> Edit SCheme...
Olie
1
Je suis coincé dans un étrange problème EXC_BAD_ACCESS, même les zombies sont ignorés, ce serait bien si vous pouviez me diriger pour ce stackoverflow.com/questions/29210057/…
Anoop Vaidya
70

La réponse de Jano est le moyen le plus simple de le trouver. Une autre façon serait de cliquer sur la barre déroulante du schéma -> modifier le schéma -> onglet arguments, puis d'ajouter NSZombieEnabled dans la colonne Variables d'environnement et OUI dans la colonne des valeurs ...

Learner2010
la source
57

Je trouve cette alternative plus pratique:

  1. Cliquez sur le menu déroulant "Run Button"
  2. Dans la liste, choisissez Profile
  3. Le programme "Instruments" devrait s'ouvrir où vous pouvez également choisir Zombies
  4. Vous pouvez maintenant interagir avec votre application et essayer de provoquer l'erreur
  5. Dès que l'erreur se produit, vous devriez obtenir une indication sur le moment où votre objet a été libéré et donc désalloué.

Des morts-vivants

Dès qu'un zombie est détecté, vous obtenez une "pile de zombies" soignée qui vous montre quand l'objet en question a été alloué et où il a été conservé ou libéré:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Avantages par rapport à l'utilisation de l'onglet de diagnostic des schémas Xcode :

  1. Si vous oubliez de décocher l'option dans l'onglet diagnostic, aucun objet ne sera libéré de la mémoire.

  2. Vous obtenez une pile plus détaillée qui vous montre dans quelles méthodes votre objet corrompu a été alloué / libéré ou conservé.

Besi
la source
1
L'option "Zombies" est manquante dans mon XCode 4, pourquoi?
Li Fumin
4
Assurez-vous de choisir iOS Simulator > Alldans la liste principale des modèles (vous ne pouvez le faire que dans le simulateur)
Besi
pour une raison quelconque ... si je sélectionne "zombies", cela montre juste les allocations .. une idée pourquoi
abbood
C'est la meilleure solution.
M'a
5

Dans Xcode 4.2

  • Nom du projet / Modifier le schéma / Diagnostics /
  • Case à cocher Activer les objets zombies
  • Vous avez terminé
pratap shaik
la source
1

Cocoa offre une fonctionnalité intéressante qui améliore considérablement vos capacités de débogage de telles situations. Il s'agit d'une variable d'environnement qui s'appelle NSZombieEnabled, regardez cette vidéo qui explique la configuration de NSZombieEnabled dans objective-C

user2554822
la source
-1

Dans Xcode> 4.3:

Vous cliquez sur la barre déroulante du schéma -> modifier le schéma -> onglet arguments, puis ajoutez NSZombieEnabled dans la colonne Variables d'environnement et YES dans la colonne des valeurs.

Bonne chance !!!

Dipak Narigara
la source