102 votes

Qu'est-ce que NSZombie ?

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

19 votes

Un NSObject mort-vivant - attention !

6 votes

Un objet NSO mort-vivant.

203voto

Adam Wright Points 31715

C'est une aide au débogage de la mémoire. Plus précisément, lorsque vous définissez NSZombieEnabled alors, chaque fois qu'un objet atteint le nombre de retenue 0, plutôt que d'être désalloué, il se transforme en un objet de type NSZombie instance. Lorsqu'un tel zombie reçoit un message, il enregistre un avertissement plutôt que de se planter ou de se comporter de manière imprévisible. Ainsi, vous pouvez déboguer les problèmes subtils de surlibération/autorelibération sans avoir recours à des outils avancés ou à une recherche minutieuse d'une aiguille dans une botte de foin.

Le nom est un jeu de mots 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 les vrais zombies, sauf qu'ils mangent moins de cerveaux.

65 votes

Veillez à supprimer ce paramètre lorsque vous avez terminé le débogage, car il entraîne une fuite de tous les objets.

1 votes

Merci pour cette explication simple. Je vous informe que le Cocoa Dev Link ne fonctionne plus. +1 pour le court et le point.

97voto

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 à utiliser des instruments - à partir de XCode, commencez par "Run with Instrument" et choisissez "Allocations".

Ensuite, arrêtez l'enregistrement juste après son démarrage, appuyez sur le bouton "i" de l'instrument Allocations, et activez "enable reference counts" et "Enable NSZombie Detection". Maintenant, appuyez à nouveau sur le bouton 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 ligne de temps de l'enregistrement - vous pouvez cliquer dessus pour trouver chaque endroit où un objet a été retenu ou relâché.

Edit : Les conseils précédents étaient pour XCode 3, voici un complément pour XCode 4 :

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

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

2 votes

C'est un conseil incroyablement utile.

4 votes

J'ai mis à jour la réponse pour XCode 4 car il est encore plus facile de faire de la détection de zombies dans les instruments.

0 votes

Pas vraiment, cela devrait fonctionner à peu près de la même manière avec XCode 5 et 6.

32voto

Matthew Frederick Points 14932

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

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

Il attire très joliment mon attention.

1voto

selva Points 781

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X