Qu'est-ce que NSZombie?

J'ai vu des suggestions disant de mettre NSZombieEnabled à true pendant le debugging. Qu'est-ce que NSZombie? Est-ce un cadre? Un paramètre?

C'est un outil de debugging de la memory. Plus précisément, lorsque vous définissez NSZombieEnabled chaque fois qu'un object atteint le nombre 0, au lieu d'être désalloué, il se transforme en 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 d'une manière imprévisible. En tant que tel, vous pouvez déboguer des problèmes subtils de sur-libération / auto-libération sans outils avancés ou aiguille laborieuse dans les searchs de botte de foin.

Le nom est un jeu assez évident sur le fait que les objects sont normalement considérés comme "morts" quand ils atteignent le nombre 0. Avec ce réglage, ils continuent d'exister dans une étrange demi-vie – ni vivant, ni tout à fait mort. Tout comme les vrais zombies, sauf qu'ils mangent un peu less de cervelle.

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 find et de suivre ces derniers.

Une approche bien meilleure pour la détection de zombies, est simplement d'utiliser des instruments – à partir de XCode démarrer avec "Exécuter avec l'instrument" et choisissez "Allocations".

Ensuite, arrêtez l'logging dès qu'il démarre, appuyez sur le button "i" de l'instrument Allocations, et activez "activer les counturs de reference" et "Activer la détection NSZombie". Maintenant, appuyez sur Enregistrer à nouveau dans l'instrument, et votre application va démarrer – si des objects zombies sont envoyés, l'logging s'arrêtera, et une boîte de dialog apparaîtra dans le calendar d'logging – vous pouvez cliquer dessus pour find chaque endroit où un object é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 Zombie – 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 va commencer à courir – faire tout ce qui provoque votre accident, une boîte de dialog apparaîtra disant "Zombie Messaged".

De là, click la petite flèche dans la boîte de dialog. Cela va prendre une list de toutes les fois où l'object zombie a été créé, conservé ou libéré. Tirez la barre latérale et vous pouvez aller à chaque input, en regardant la trace de la stack pour le code qui était responsable de chaque ajustement dans le count de retenue.

Je suis d'accord avec ce que Kendall a ajouté, c'est très utile, mais je vais suggérer de faire encore la variable d'environnement pour ne pas oublier qu'ils sont activés. Semblable au lien (maintenant expiré) chez Cocoa Dev, je mets ça pour que je ne le rate pas:

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

Cela attire mon attention très bien.