Comment configurer NSZombieEnabled
et CFZombieLevel
pour mon exécutable dans Xcode 4?
Comment configurer NSZombieEnabled
et CFZombieLevel
pour mon exécutable dans Xcode 4?
Réponses:
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 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:
-[UITableView release]: message sent to deallocated instance
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.
CMD-<
( CMD-SHIFT-comma
), ouProduct -> Scheme -> Edit SCheme...
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 ...
Je trouve cette alternative plus pratique:
Profile
Zombies
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 :
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 vous montre dans quelles méthodes votre objet corrompu a été alloué / libéré ou conservé.
iOS Simulator > All
dans la liste principale des modèles (vous ne pouvez le faire que dans le simulateur)
Dans Xcode 4.2
ou sélectionnez Edit Scheme
dans Product
> Scheme
Menu
sélectionnez dans Enable Zombie Objects
l' Diagnostics
onglet
Comme alternative, si vous préférez les .xcconfig
fichiers, 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. 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
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 !!!