Wie richte ich NSZombieEnabled in Xcode 4 ein?

456

Wie richte ich meine ausführbare Datei in Xcode 4 ein NSZombieEnabledund CFZombieLevelfür sie?

Chetan
quelle
1
Fragen Sie nach Xcode 4?
Jehiah
8
Warum Optionen wie diese nicht standardmäßig aktiviert sind, ist mir ein
Daniel Magnusson
26
Weil es im Grunde genommen eine echte Speicherfreigabe verhindert, was standardmäßig keine gute Idee zu aktivieren scheint.
Chetan
14
@ Daniel Magnusson: Es ist eine Überlebens-der-Stärksten-Sache. Indem Sie die Entwicklung mit XCode unfreundlich, aber praktikabel machen, erhalten Sie bessere Entwickler. Ich mache nur Spaß.
Dan Rosenstark
3
@DanielMagnusson Ich denke, das ist keine schlechte Idee. AFAIK Der "Zombie" -Modus ändert jedes Objekt in ein spezielles Objekt, damit es erkennen kann, wann Nachrichten gesendet werden. Wenn Sie also den "Zombie-Modus" aktiviert haben, wird kein Objekt freigegeben. Sie sollten ihn also wirklich nur verwenden, wenn Sie solche Fehler beheben.
Besi

Antworten:

753

Drücken Sie in Xcode 4.x.

R

(oder klicken Sie auf Menubar> Product> Scheme> Edit Scheme)

Wählen Sie die Registerkarte "Diagnose" und klicken Sie auf "Zombie-Objekte aktivieren":

Klicken Sie auf "Zombie-Objekte aktivieren".

Dadurch werden freigegebene Objekte in NSZombie-Instanzen umgewandelt, die bei erneuter Verwendung Konsolenwarnungen drucken. Dies ist eine Debugging-Hilfe, die die Speichernutzung erhöht (kein Objekt wird wirklich freigegeben), aber die Fehlerberichterstattung verbessert.

Ein typischer Fall ist, wenn Sie ein Objekt übermäßig freigeben und nicht wissen, welches:

  • Mit Zombies: -[UITableView release]: message sent to deallocated instance
  • Ohne Zombies: EXC_BAD_ACCESS

Diese Xcode-Einstellung wird ignoriert, wenn Sie die Anwendung für die App Store-Übermittlung archivieren. Sie müssen nichts berühren, bevor Sie Ihre Anwendung freigeben.

Das Drücken entspricht Rdem Auswählen von Produkt> Ausführen, während die AltTaste gedrückt gehalten wird.
Das Klicken auf das Kontrollkästchen "Zombie-Objekte aktivieren" entspricht dem manuellen Hinzufügen von "NSZombieEnabled = YES" im Abschnitt "Umgebungsvariablen" der Registerkarte "Argumente".

Jano
quelle
27
Danke - ich habe mich gefragt, wo sie diese Optionen versteckt haben. Jetzt ist mir klar, dass dies das gleiche Fenster ist wie im Menü "Schema bearbeiten".
Emp
1
Um dies zu ergänzen, wird es im Bildschirm "Ausführen" auch auf "Test" gesetzt, wenn das Kontrollkästchen "Optionen der Aktion" Ausführen "aktiviert ist. Wenn Sie es nur für Test tun möchten, muss dieses Kontrollkästchen deaktiviert sein
Cameron
1
Bitte beachten Sie auch, dass diese Option auf Xcode 4.1 (richtig?)
Phi
2
In XCode 5 (und späteren Versionen von 4 - 4.3.x sicher, vielleicht früher) ist dies CMD-<( CMD-SHIFT-comma) oderProduct -> Scheme -> Edit SCheme...
Olie
1
Ich stecke in einem seltsamen EXC_BAD_ACCESS-Problem fest, selbst die Zombies werden übersprungen. Es wäre schön, wenn Sie mich für diesen Stackoverflow.com/questions/29210057/…
Anoop Vaidya
70

Janos Antwort ist der einfachste Weg, sie zu finden. Ein anderer Weg wäre, wenn Sie auf die Dropdown-Leiste Schema -> Schema bearbeiten -> Argumente klicken und dann NSZombieEnabled in der Spalte Umgebungsvariablen und JA in der Wertespalte hinzufügen ...

learner2010
quelle
57

Ich finde diese Alternative bequemer:

  1. Klicken Sie auf die Dropdown-Liste "Ausführen".
  2. Wählen Sie aus der Liste Profile
  3. Das Programm "Instrumente" sollte sich öffnen, wo Sie auch wählen können Zombies
  4. Jetzt können Sie mit Ihrer App interagieren und versuchen, den Fehler zu verursachen
  5. Sobald der Fehler auftritt, sollten Sie einen Hinweis erhalten, wann Ihr Objekt freigegeben und daher freigegeben wurde.

Zombies

Sobald ein Zombie erkannt wird, erhalten Sie einen ordentlichen "Zombie-Stapel", der Ihnen anzeigt, wann das betreffende Objekt zugewiesen wurde und wo es aufbewahrt oder freigegeben wurde:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Vorteile gegenüber der Registerkarte "Diagnose" der Xcode-Schemata :

  1. Wenn Sie vergessen, die Option auf der Registerkarte Diagnose zu deaktivieren, werden keine Objekte aus dem Speicher freigegeben.

  2. Sie erhalten einen detaillierteren Stapel, der Ihnen zeigt, auf welche Weise Ihr beschädigtes Objekt zugewiesen / freigegeben oder beibehalten wurde.

Besi
quelle
1
Die Option "Zombies" fehlt in meinem XCode 4, warum?
Li Fumin
4
Stellen Sie sicher, dass Sie iOS Simulator > Allaus der Hauptvorlagenliste auswählen (Sie können dies nur im Simulator tun)
Besi
Aus irgendeinem Grund ... wenn ich "Zombies" auswähle, werden nur Zuordnungen angezeigt. Irgendeine Idee warum?
Abbood
Dies ist die beste Lösung. Hat mir sehr geholfen :)
Michał Miszczyszyn
5

In Xcode 4.2

  • Projektname / Bearbeitungsschema / Diagnose /
  • Kontrollkästchen Zombie-Objekte aktivieren
  • Du bist fertig
Pratap Shaik
quelle
1

Cocoa bietet eine coole Funktion, die Ihre Möglichkeiten zum Debuggen solcher Situationen erheblich verbessert. Es handelt sich um eine Umgebungsvariable mit dem Namen NSZombieEnabled. In diesem Video wird das Einrichten von NSZombieEnabled in Ziel-C erläutert

user2554822
quelle
-1

In Xcode> 4.3:

Sie klicken auf die Dropdown-Leiste Schema -> Schema bearbeiten -> Registerkarte Argumente und fügen dann NSZombieEnabled in der Spalte Umgebungsvariablen und JA in der Wertespalte hinzu.

Viel Glück !!!

Dipak Narigara
quelle