Comment puis-je configurer NSZombieEnabled
et CFZombieLevel
pour mon exécutable dans Xcode 4?
Réponses
Trop de publicités?Dans Xcode 4.x appuyez sur
⌥⌘R
(ou cliquez sur Menubar
> Product
> Scheme
> Edit Scheme
)
sélectionnez le "Diagnostic" de l'onglet et cliquez sur "Activer Zombie Objets":
Ceci permet d'objets publiés dans NSZombie instances d'impression de la console d'avertissements lorsque les utiliser de nouveau. C'est un débogage aide qui augmente l'utilisation de la mémoire (aucun objet n'est vraiment sorti) mais améliore le rapport d'erreurs.
Un cas typique est lorsque vous relâchez un objet et vous ne savez pas lequel:
- Avec des zombies:
-[UITableView release]: message sent to deallocated instance
- Sans zombies:
Cette Xcode paramètre est ignoré lorsque vous archivez l'application de l'App Store de soumission. Vous n'avez pas besoin de toucher à rien avant de publier votre application.
Sur ⌥⌘R est la même que la sélection du Produit > Exécuter tout en gardant la touche Alt enfoncée.
En cliquant sur "Activer Zombie Objets" case à cocher est le même que l'ajout manuel d' "NSZombieEnabled = OUI" dans la section "Variables d'Environnement" de l'onglet Arguments.
Je trouve cette solution plus pratique:
- Cliquez sur le "Bouton Exécuter de la liste Déroulante"
- Dans la liste choisissez
Profile
- Le programme "Instruments" devrait s'ouvrir où vous pouvez également choisir
Zombies
- Maintenant, vous pouvez interagir avec votre application et essayer de provoquer l'erreur
- Dès que l'erreur se produit, vous devriez obtenir un indice sur lorsque votre objet a été libéré et donc libéré.
Dès qu'un zombie est détecté, vous obtenez alors un pur "Zombie Pile" qui vous indique quand l'objet en question a été affecté et où il a été retenu ou sortie:
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 du diagnostic de l'onglet Xcode Régimes:
Si vous avez oublié de décocher l'option dans le diagnostic de l'onglet il y a pas d'objets sera libéré de la mémoire.
Vous obtenez une vue plus détaillée de pile qui vous montre quelles sont les méthodes de votre corrompus objet a été alloué / publié ou conservés.
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 cette vidéo qui explique comment configurer NSZombieEnabled dans l'objectif-C