Wie richte ich ein NSZombieEnabled
y CFZombieLevel
für meine ausführbare Datei in Xcode 4?
Antworten
Zu viele Anzeigen?In Xcode 4.x drücken Sie
R
(oder klicken Sie Menubar
> Product
> Scheme
> Edit Scheme
)
Wählen Sie die Registerkarte "Diagnose" und klicken Sie auf "Zombie-Objekte aktivieren":
Dadurch werden freigegebene Objekte zu NSZombie-Instanzen, die bei erneuter Verwendung Konsolenwarnungen ausgeben. Dies ist eine Debugging-Hilfe, die den Speicherverbrauch erhöht (kein Objekt wird wirklich freigegeben), aber die Fehlerberichterstattung verbessert.
Ein typischer Fall ist, wenn Sie ein Objekt zu viel freigeben und nicht wissen, welches:
- Mit Zombies:
-[UITableView release]: message sent to deallocated instance
- Ohne Zombies:
Diese Xcode-Einstellung wird ignoriert, wenn Sie die Anwendung für die Einreichung im App Store archivieren. Sie brauchen nichts zu ändern, bevor Sie Ihre Anwendung freigeben.
Drücken Sie R ist dasselbe wie die Auswahl von Produkt > Ausführen unter Beibehaltung der Option Alt Taste gedrückt.
Das Anklicken des Kontrollkästchens "Zombie-Objekte aktivieren" ist dasselbe wie das manuelle Hinzufügen von "NSZombieEnabled = YES" im Abschnitt "Umgebungsvariablen" der Registerkarte Argumente.
Ich finde diese Alternative bequemer:
- Klicken Sie auf die Dropdown-Schaltfläche "Ausführen".
- Wählen Sie aus der Liste
Profile
- Es sollte sich das Programm "Instrumente" öffnen, in dem Sie auch wählen können
Zombies
- Jetzt können Sie mit Ihrer Anwendung interagieren und versuchen, den Fehler zu verursachen
- Sobald der Fehler auftritt, sollten Sie einen Hinweis darauf erhalten, wann Ihr Objekt freigegeben und damit deallociert wurde.
Sobald ein Zombie entdeckt wird, erhalten Sie einen übersichtlichen "Zombie-Stapel", der Ihnen anzeigt, wann das betreffende Objekt zugewiesen wurde und wo es behalten 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 im Vergleich zur Verwendung der Diagnoseregisterkarte von Xcode Schemes :
-
Wenn Sie vergessen, die Option auf der Registerkarte Diagnose zu deaktivieren, werden keine Objekte aus dem Speicher freigegeben.
-
Sie erhalten einen detaillierteren Stack, der Ihnen zeigt, in welchen Methoden Ihr beschädigtes Objekt zugewiesen/freigegeben oder zurückgehalten wurde.
Ein in Xcode 7
<
oder wählen Sie Edit Scheme
de Product
> Scheme
Menü
Wählen Sie Enable Zombie Objects
bilden die Diagnostics
Registerkarte
Alternativ, wenn Sie es vorziehen .xcconfig
Dateien können Sie diesen Artikel lesen https://therealbnut.wordpress.com/2012/01/01/setting-xcode-4-0-environment-variables-from-a-script/
- See previous answers
- Weitere Antworten anzeigen