Qu'est-ce que NSZombie?

97

J'ai vu des suggestions indiquant de définir NSZombieEnabledsur truelors du débogage. Qu'est-ce que NSZombie? Est-ce un cadre? Un paramètre?

Moshe
la source
18
Un NSObject mort-vivant - méfiez-vous!
vikingosegundo
5
Un NSObject * mort-vivant.
Alex Zavatone

Réponses:

192

C'est une aide au débogage de la mémoire. Plus précisément, lorsque vous définissez le paramètre, NSZombieEnabledchaque fois qu'un objet atteint le compte de conservation 0, au lieu d'être désalloué, il se transforme en une NSZombieinstance. Chaque fois qu'un tel zombie reçoit un message, il enregistre un avertissement plutôt que de planter ou de se comporter de manière imprévisible. En tant que tel, vous pouvez déboguer de subtils problèmes de sur-libération / libération automatique sans outils avancés ni 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 de conservation 0. Avec ce paramètre, ils continuent d'exister dans une étrange demi-vie - ni vivants, ni tout à fait morts. Un peu comme de vrais zombies, sauf qu'ils mangent moins de cerveaux.

Adam Wright
la source
61
Veillez à supprimer ce paramètre lorsque vous avez terminé le débogage, car il perd essentiellement chaque objet.
Justin
1
Merci pour cette simple explication. Informez-vous que Cocoa Dev Link ne fonctionne plus. +1 pour faire court et au point.
CRDave
95

Adam a fait un excellent travail en expliquant ce que sont les zombies, mais l'utilisation de la variable d'environnement n'est pas le meilleur moyen 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 les comptages de 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 des messages 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és ou libérés.

Edit: Le conseil précédent concernait 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 de zombies - l'instrument Zombie. Au lieu de "Exécuter" pour démarrer l'application, utilisez "Profil" et un sélecteur d'instrument apparaîtra. Sélectionnez "Zombie", et l'application commencera à fonctionner - faites ce qui cause votre plantage, une boîte de dialogue apparaîtra disant "Zombie Messaged".

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

Kendall Helmstetter Gelner
la source
2
Ce sont des conseils extrêmement utiles.
w.donahue
4
J'ai mis à jour la réponse pour XCode 4 car cela rend encore plus facile la détection de zombies dans les instruments.
Kendall Helmstetter Gelner
Pas vraiment, devrait fonctionner à peu près de la même manière avec XCode 5 et 6.
Kendall Helmstetter Gelner
2
Je peux également confirmer qu'avec XCode 7.2
Battre
31

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

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

Cela attire très bien mon attention.

Matthieu Frederick
la source