web-dev-qa-db-fra.com

Comment configurer NSZombieEnabled dans Xcode 4?

Comment configurer NSZombieEnabled et CFZombieLevel pour mon exécutable dans Xcode 4?

456
Chetan

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

Click "Enable Zombie Objects"

Cela transforme les objets libérés en instances NSZombie qui affichent les 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 réellement libéré) mais améliore le rapport d'erreur.

Un cas typique est lorsque vous relâchez trop un objet sans savoir lequel:

  • Avec les 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 dans l'App Store. Vous n'avez rien besoin de toucher avant de publier votre application.

Pressage R revient à sélectionner Produit> Exécuter tout en gardant la Alt touche enfoncée.
Activer la case à cocher "Activer les objets Zombie" revient à ajouter manuellement "NSZombieEnabled = YES" dans la section "Variables d'environnement" de l'onglet Arguments.

754
Jano

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

70
learner2010

Je trouve cette alternative plus pratique:

  1. Cliquez sur "Run Button Dropdown"
  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 avoir un indice sur le moment où votre objet a été publié et donc désalloué.

Zombies

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

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 comparés à 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 indique dans quelles méthodes votre objet corrompu a été alloué/libéré ou conservé.

57
Besi

Sur dans Xcode 7

<

ou sélectionnez Edit Scheme dans le menu Product> Scheme

sélectionnez Enable Zombie Objects dans l'onglet Diagnostics

xcode 7 zombie flag

Si vous préférez les fichiers .xcconfig, vous pouvez également lire cet article https://therealbnut.wordpress.com/2012/01/01/setting-xcode-4-0-environment-variables-from -a-script /

5
IgnazioC

Dans Xcode 4.2

  • Nom du projet/Edit Scheme/Diagnostics /
  • Case à cocher Activer les objets zombies
  • Vous avez terminé
5
pratap shaik

Cocoa offre une fonctionnalité intéressante qui améliore considérablement vos capacités à déboguer de telles situations. C'est une variable d'environnement qui s'appelle NSZombieEnabled, regardez ceci vidéo qui explique comment configurer NSZombieEnabled dans objective-C

1
user2554822