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?
Antworten
Zu viele Anzeigen?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.
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.
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.
Würde jemandem helfen.
Ausführliches Dokument über Instrumente. https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1