103 Stimmen

Was ist NSZombie?

Ich habe Vorschläge gesehen, die besagen, man solle NSZombieEnabled a true während der Fehlersuche. Was ist NSZombie? Ist es ein Framework? Eine Einstellung?

206voto

Adam Wright Punkte 48270

Es ist eine Hilfe bei der Fehlersuche im Speicher. Genauer gesagt, wenn Sie NSZombieEnabled Wenn ein Objekt die Beibehaltungszahl 0 erreicht, wird es nicht mehr freigegeben, sondern verwandelt sich in ein NSZombie Instanz. Wenn ein solcher Zombie eine Nachricht erhält, gibt er eine Warnung aus, anstatt abzustürzen oder sich unvorhersehbar zu verhalten. So können Sie subtile Überfreigabe-/Autorelease-Probleme ohne fortgeschrittene Tools oder mühsame Suche nach der Nadel im Heuhaufen beheben.

Der Name ist eine ziemlich offensichtliche Anspielung auf die Tatsache, dass Objekte normalerweise als "tot" gelten, wenn sie den Wert 0 erreichen. Mit dieser Einstellung existieren sie in einer seltsamen Halbwertszeit weiter - weder lebendig, noch ganz tot. Ähnlich wie echte Zombies, nur dass sie weniger Hirn essen.

97voto

Adam hat sehr gut erklärt, was Zombies sind, aber die Verwendung der Umgebungsvariablen ist nicht der beste Weg, um sie zu finden und zu verfolgen.

Ein viel besserer Ansatz zur Zombie-Erkennung ist die Verwendung von Instrumenten - starten Sie in XCode mit "Run with Instrument" und wählen Sie "Allocations".

Dann stoppen Sie die Aufnahme direkt nach dem Start, drücken Sie die Taste "i" im Instrument "Allocations" und schalten Sie "enable reference counts" und "Enable NSZombie Detection" ein. Wenn irgendwelche Zombie-Objekte gesendet werden, wird die Aufnahme gestoppt und ein Dialogfeld erscheint in der Aufnahmezeitleiste - Sie können darauf klicken, um jede Stelle zu finden, an der ein Objekt zurückgehalten oder freigegeben wurde.

Edit: Der vorherige Ratschlag war für XCode 3, hier ist ein Zusatz für XCode 4:

In XCode 4.2 gibt es einen noch einfacheren Mechanismus, um die Zombie-Erkennung zu nutzen - das Zombie-Instrument. Anstelle von "Ausführen", um die App zu starten, verwenden Sie "Profil" und ein Instrumentenauswahlfenster wird angezeigt. Wählen Sie "Zombie", und die App beginnt zu laufen - tun Sie, was auch immer Ihren Absturz verursacht, und ein Dialog wird auftauchen, der sagt "Zombie Messaged".

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

32voto

Matthew Frederick Punkte 22117

Ich stimme dem zu, was Kendall hinzugefügt hat, es ist sehr nützlich, aber ich schlage vor, die Umgebungsvariable zu verwenden, damit Sie nicht vergessen, dass sie aktiviert ist. Ähnlich wie die (jetzt abgelaufen) Link bei Cocoa Dev, habe ich diese, so dass ich es nicht verpassen:

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

Er erregt meine Aufmerksamkeit sehr gut.

1voto

selva Punkte 791

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X