2009-07-14 12 views
1

Ich habe NSZombieEnabled in die Umgebung meiner ausführbaren Datei hinzugefügt, um ein Objekt aufzuspüren, das ich zu lange freigebe. Was ich jetzt finde, ist, dass ein Teil meiner App abstürzt, der nie zuvor abgestürzt ist, nur wenn NSZombieEnabled aktiviert ist. In dem Moment, in dem ich es deaktiviere, tritt kein Absturz auf.NSZombie-Absturz-App, wenn auf dem iPhone aktiviert

Ich brauche auf meinem Code Forensik, aber was kann das bedeuten? NSZombieEnabled hält Objekte in der Umgebung, die die Freigabenachricht gesendet werden. Das könnte mich zum Absturz bringen, aber sollte es?

Auch die Einstellung des Breakpoints - [_ NSZombie methodSignatureForSelector:] gibt mir nicht wirklich genug Stack-Trace, um zu wissen, was vor sich geht.

Antwort

3

Wenn Ihre App mit NSZombieEnabled abstürzt, besteht eine gute Chance, dass sie abstürzt, nur nicht so schnell und nicht so offensichtlich.

NSZombieEnabled hält Objekte in der Umgebung, die die Freigabenachricht gesendet werden. Das könnte mich zum Absturz bringen, aber sollte es?

Nein, es führt nicht zum Absturz. Was Sie zum Absturz bringt, ist das Senden zu vieler Release-Nachrichten an ein Objekt. Dafür ist NSZombieEnabled gedacht.

Auch die Einstellung des Haltepunkts - [_ NSZombie methodSignatureForSelector:] gibt mir nicht wirklich genug Stack-Trace, um zu wissen, was vor sich geht.

Versuchen Sie, die ObjectAlloc-Voreinstellung in Instruments zu verwenden.

3

Unter NSZombieEnabled werden Objekte nicht vollständig freigegeben, sie werden nur zu Zombies. Dies bedeutet, dass sich während der Ausführung Speicher ansammeln kann, insbesondere in Schleifen, in denen Sie möglicherweise eine Reihe von NSS-Strings oder Ähnliches generieren. Ihre Anwendung wird möglicherweise aufgrund der Speichernutzung beendet.

Ich machte den Fehler das anzuschalten und vergaß es, dann verbrachte ich die meiste Zeit damit herauszufinden, warum meine Speicherauslastung weiter anstieg, wenn ich keine offensichtlichen Lecks hatte.

1

Eine Möglichkeit: Es kann sein, dass Sie mit einem ungültigen Zeiger auf ein Objekt zugreifen und zufällig feststellen, dass ein anderes kompatibles Objekt dort platziert wird. In diesem Fall würde NSZombie verhindern, dass das Objekt durch etwas Kompatibles ersetzt wird, und statt dessen einen Zombie an seinen Platz setzen.