web-dev-qa-db-fra.com

Qu'est-ce que NSZombie?

J'ai vu des suggestions disant de définir NSZombieEnabled sur true pendant le débogage. Qu'est-ce que NSZombie? Est-ce un cadre? Un paramètre?

91
Moshe

C'est une aide au débogage de la mémoire. Plus précisément, lorsque vous définissez NSZombieEnabled, chaque fois qu'un objet atteint conserve le nombre 0, au lieu d'être désalloué, il se transforme en une instance NSZombie. Chaque fois qu'un tel zombie reçoit un message, il enregistre un avertissement plutôt que de s'écraser ou de se comporter de manière imprévisible. En tant que tel, vous pouvez déboguer des problèmes subtils de sur-libération/libération automatique sans outils avancés ou aiguille minutieuse dans les recherches de meules de foin.

Le nom est un jeu assez évident sur le fait que les objets sont normalement considérés comme "morts" lorsqu'ils atteignent le compte 0. Avec ce paramètre, ils continuent d'exister dans une étrange demi-vie - ni vivante, ni tout à fait morte. Tout comme les vrais zombies, sauf qu'ils mangent un peu moins de cerveaux.

177
Adam Wright

Adam a fait un excellent travail en expliquant ce que sont les zombies, mais l'utilisation de la variable d'environnement n'est pas la meilleure façon de les trouver et de les suivre.

Une bien meilleure approche de la détection des zombies consiste simplement à utiliser des instruments - à partir de XCode, commencez par "Exécuter avec l'instrument" et choisissez "Allocations".

Arrêtez ensuite l'enregistrement juste après son démarrage, appuyez sur le bouton "i" de l'instrument Allocations et activez "Activer le décompte des références" et "Activer la détection NSZombie". Maintenant, appuyez à nouveau sur Enregistrer dans l'instrument et votre application démarrera - si des objets zombies sont envoyés, l'enregistrement s'arrêtera et une boîte de dialogue apparaîtra dans la chronologie d'enregistrement - vous pouvez cliquer dessus pour trouver chaque endroit où un objet était conservé ou libéré.

Edit: Le conseil précédent était pour XCode 3, voici un ajout pour XCode 4:

Dans XCode 4.2, il existe un mécanisme encore plus simple pour utiliser la détection des zombies - l'instrument zombie. Au lieu de "Exécuter" pour démarrer l'application, utilisez "Profil" et un sélecteur d'instruments apparaîtra. Sélectionnez "Zombie", et l'application commencera à fonctionner - faites ce qui provoque votre crash, une boîte de dialogue apparaîtra indiquant "Zombie Messaged".

De là, cliquez sur la petite flèche dans la boîte de dialogue. Cela vous amènera à une liste de toutes les fois où l'objet zombie a été créé, conservé ou publié. Tirez la barre latérale et vous pouvez accéder à chaque entrée, en regardant la trace de la pile pour le code qui était responsable de chaque ajustement du nombre de retenues.

Je suis d'accord avec ce que Kendall a ajouté, c'est très utile, mais je suggère de continuer à faire la variable d'environnement pour ne pas oublier qu'elle est activée. Semblable au lien (maintenant expiré) de Cocoa Dev, je mets cela pour ne pas le manquer:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
    NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
} 

Cela attire très bien mon attention.

31
Matthew Frederick
1
selva