Comment configurer NSZombieEnabled dans Xcode 4?

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

Dans Xcode 4.x appuyez sur

R

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

sélectionnez l’onglet “Diagnostics” et cliquez sur “Activer les objects Zombie”:

Cliquez sur

Cela transforme les objects libérés en instances NSZombie qui impriment les avertissements de la console lorsqu’ils sont à nouveau utilisés. Ceci est une aide au débogage qui augmente l’utilisation de la mémoire (aucun object n’est réellement libéré) mais améliore le signalement des erreurs.

Un cas typique est lorsque vous libérez un object 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 App Store. Vous n’avez besoin de rien toucher avant de lancer votre application.

Appuyer sur ⌥⌘R revient à sélectionner Produit> Exécuter tout en maintenant la touche Alt enfoncée.
Cliquer sur la case à cocher “Activer les objects Zombie” revient à append manuellement “NSZombieEnabled = YES” dans la section “Variables d’environnement” de l’onglet Arguments.

La réponse de Jano est le moyen le plus simple de le trouver. Une autre manière serait de cliquer sur la barre de menus -> edit scheme -> tab puis sur NSZombieEnabled dans la colonne Environment Variables et YES dans la colonne …

Je trouve cette alternative plus pratique:

  1. Cliquez sur le bouton déroulant “Run Button”
  2. Dans la liste, choisissez Profile
  3. Le programme “Instruments” devrait s’ouvrir où vous pouvez également choisir des Zombies
  4. Maintenant, vous pouvez interagir avec votre application et essayer de provoquer l’erreur
  5. Dès que l’erreur se produit, vous devriez obtenir un indice sur la libération de votre object et sa désallocation.

Des morts-vivants

Dès qu’un zombie est détecté, vous obtenez alors un “Zombie Stack” soigné qui vous indique quand l’object 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 par rapport à l’utilisation de l’onglet Diagnostic des systèmes Xcode :

  1. Si vous oubliez de décocher l’option dans l’onglet Diagnostic, aucun object ne sera libéré de la mémoire.

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

Dans Xcode 4.2

  • Nom du projet / Modifier le schéma / Diagnostic /
  • Activer la case à cocher Objets Zombie
  • Vous avez terminé

Sur In Xcode 7

<

ou sélectionnez Edit Scheme partir du Product > Menu du Scheme

sélectionnez Enable Zombie Objects l'onglet Diagnostics

xcode 7 drapeau de zombie

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

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

Dans Xcode> 4.3:

Vous cliquez sur la barre de défilement du schéma -> Modifier le schéma -> onglet Arguments puis ajoutez NSZombieEnabled dans la colonne Variables d’environnement et YES dans la colonne Valeur.

Bonne chance !!!