Comment configurer NSZombieEnabled
et CFZombieLevel
pour mon exécutable dans Xcode 4?
Dans Xcode 4.x, appuyez sur
(ou cliquez sur Menubar
> Product
> Scheme
> Edit Scheme
)
sélectionnez l'onglet "Diagnostics" et cliquez sur "Activer les objets Zombie":
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:
-[UITableView release]: message sent to deallocated instance
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.
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 ...
Je trouve cette alternative plus pratique:
Profile
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:
Si vous oubliez de décocher l'option dans l'onglet Diagnostic, aucun objet ne sera libéré de la mémoire.
Vous obtenez une pile plus détaillée qui indique dans quelles méthodes votre objet corrompu a été alloué/libéré ou conservé.
ou sélectionnez Edit Scheme
dans le menu Product
> Scheme
sélectionnez Enable Zombie Objects
dans l'onglet Diagnostics
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 /
Dans Xcode 4.2
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