Was ist NSZombie?

97

Ich habe sagen gesehen Vorschläge zu setzen , NSZombieEnabledum truewährend des Debuggens. Was ist NSZombie? Ist es ein Rahmen? Eine Einstellung?

Moshe
quelle
18
Ein untotes NSObject - Vorsicht!
Vikingosegundo
5
Ein * untotes NSObject.
Alex Zavatone

Antworten:

191

Es ist eine Speicher-Debugging-Hilfe. Insbesondere wenn Sie festlegen, dass NSZombieEnabledein Objekt , wenn es die Anzahl 0 beibehält, nicht freigegeben wird, sondern sich selbst in eine NSZombieInstanz verwandelt . Immer wenn ein solcher Zombie eine Nachricht empfängt, protokolliert er eine Warnung, anstatt abzustürzen oder sich unvorhersehbar zu verhalten. Auf diese Weise können Sie subtile Probleme mit Überfreigabe / Autorelease ohne erweiterte Tools oder sorgfältige Nadel bei der Suche nach Heuhaufen beheben.

Der Name ist ein ziemlich offensichtliches Spiel mit der Tatsache, dass Objekte normalerweise als "tot" betrachtet werden, wenn sie die Anzahl 0 beibehalten. Mit dieser Einstellung existieren sie weiterhin in einer seltsamen Halbwertszeit - weder lebend noch ganz tot. Ähnlich wie echte Zombies, nur dass sie weniger Gehirn fressen.

Adam Wright
quelle
61
Entfernen Sie diese Einstellung nach dem Debuggen, da dadurch im Wesentlichen jedes Objekt verloren geht.
Justin
1
Vielen Dank für diese einfache Erklärung. Lassen Sie uns informieren, dass Cocoa Dev Link nicht mehr funktioniert. +1 kurz und auf den Punkt.
CRDave
95

Adam hat großartige Arbeit geleistet, um zu erklären, was Zombies sind, aber die Verwendung der Umgebungsvariablen ist nicht der beste Weg, diese zu finden und zu verfolgen.

Ein viel besserer Ansatz zur Zombieerkennung ist die Verwendung von Instrumenten. Beginnen Sie in XCode mit "Mit Instrument ausführen" und wählen Sie "Zuordnungen".

Stoppen Sie dann die Aufnahme direkt nach dem Start, drücken Sie die Taste "i" am Allocations-Instrument und aktivieren Sie "Referenzzählungen aktivieren" und "NSZombie-Erkennung aktivieren". Drücken Sie nun im Instrument erneut auf Aufzeichnen, und Ihre App wird gestartet. Wenn Zombie-Objekte gesendet werden, wird die Aufzeichnung gestoppt und in der Aufnahmezeitleiste wird ein Dialogfeld angezeigt. Klicken Sie darauf, um jeden Ort zu finden, an dem sich ein Objekt befand behalten oder freigegeben.

Bearbeiten: Vorheriger Rat war für XCode 3, hier ist eine Ergänzung für XCode 4:

In XCode 4.2 gibt es einen noch einfacheren Mechanismus, um die Zombie-Erkennung zu nutzen - das Zombie-Instrument. Verwenden Sie anstelle von "Ausführen" zum Starten der App "Profil". Daraufhin wird eine Instrumentenauswahl angezeigt. Wählen Sie "Zombie" und die App wird gestartet. Was auch immer Ihren Absturz verursacht, es erscheint ein Dialogfeld mit der Aufschrift "Zombie Messaged".

Klicken Sie dort auf den kleinen Pfeil im Dialogfeld. Daraufhin wird eine Liste aller Zeiten angezeigt, zu denen das Zombie-Objekt erstellt, beibehalten oder freigegeben wurde. Ziehen Sie die Seitenleiste nach oben, und Sie können zu jedem Eintrag gehen und in der Stapelverfolgung nach dem Code suchen, der für jede Anpassung der Aufbewahrungsanzahl verantwortlich war.

Kendall Helmstetter Gelner
quelle
2
Dies ist ein unglaublich nützlicher Rat.
w.donahue
4
Ich habe die Antwort für XCode 4 aktualisiert, da dies die Zombieerkennung in Instrumenten noch einfacher macht.
Kendall Helmstetter Gelner
Nicht wirklich, sollte mit XCode 5 und 6 ziemlich gleich funktionieren.
Kendall Helmstetter Gelner
2
Ich kann das auch mit XCode 7.2 bestätigen
Beat
31

Ich stimme dem zu, was Kendall hinzugefügt hat. Es ist sehr nützlich, aber ich schlage vor, die Umgebungsvariable weiterhin auszuführen, damit Sie nicht vergessen, dass sie aktiviert sind. Ähnlich wie bei dem (jetzt abgelaufenen) Link bei Cocoa Dev habe ich dies so gesetzt, dass ich es nicht vermisse:

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

Es erregt meine Aufmerksamkeit sehr schön.

Matthew Frederick
quelle