iphone - videos - xcode memory graph




Wie Debuggen "Nachricht an nicht freigegebenen Instanz gesendet" in Xcode4? (2)

Ich habe ALT + CMD + R gedrückt und NSZombieEnabled in Argumente> Umgebungsvariablen aktiviert. Zusätzlich habe ich es unter Diagnose> Speicherverwaltung> Zombie-Objekte aktivieren aktiviert.

Jedoch, wenn ich gebaut und ausgeführt habe, stürzt meine App irgendwann ab und gibt mir diese nutzlose Nachricht in der Konsole:

*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260

Die Stapelverfolgung ist genauso nutzlos. Ich habe den Schieberegler für Details auf der rechten Seite ganz nach rechts verschoben. Thread 1 zeigt mir das einfach:

Alles ist im Besitz des Systems und es gibt keine einzige Zeile, die mit meiner App zusammenhängt. Offensichtlich funktioniert NSZombiesEnabled nicht wie in Xcode 3, wo es auf dem toten Objekt angehalten hat.

Gibt es eine Möglichkeit herauszufinden, welcher CALayer zu früh freigegeben wird?

Update: Also nach dem Aufbauen und Laufen ca. 100 weitere Male plötzlich das Problem DISAPPEARED! Es ist komplett weg! Und das Beste: Ich habe meinen Code in keiner Weise verändert! Zwischendurch habe ich den Build-Ordner und das Projekt mehrmals mit den clean-Befehlen geputzt und die App im Simulator mehrmals gelöscht.

Update 2: Zum Glück ist das Problem wieder aufgetaucht. Und jetzt scheint es hartnäckig. Zum Glück, weil ich lieber die Ursache suche, anstatt die Benutzer zufällig zu ärgern.

Update 3: Endlich zufällig gefunden:

startButton = newBttn;

gewesen sein sollte:

self.startButton = newBttn;

startButton war eine beibehaltene Eigenschaft und in -dealloc habe ich es freigegeben. So wurde es überveröffentlicht und in den meisten (aber nicht allen) Fällen, nachdem die Ansicht ausgeblendet wurde, stürzte es ab und gab die seltsame CALayer retainCount Nachricht.

Das Zombies Instrument (CMD + I) wies schließlich darauf hin, dass es sich um einen Knopf handeln musste. Ich wusste einfach nicht warum und wo.

Clang Static Analyzer hat sich nicht über diesen offensichtlichen Fehler beschwert.


Neben Jeffs großer Antwort; um fast dasselbe zu tun, aber ohne Instrumente öffnen oder Ihre App profilieren zu müssen, können Sie NSZombieEnabled , MallocStackLogging und malloc im Debugger schützen . Wenn Ihre App abstürzt, geben Sie Folgendes in die gdb-Konsole ein:

(gdb) info malloc-history 0x543216

Ersetzen Sie 0x543216 mit der Adresse des Objekts, das den Absturz verursacht hat, und Sie werden eine viel nützlichere Stapelüberwachung erhalten und es sollte Ihnen helfen, die genaue Zeile in Ihrem Code genau zu lokalisieren, die das Problem verursacht.

Dieser Artikel enthält einige zusätzliche Informationen.


Wenn dies wieder auftaucht, kannst du ein spezielles Zombies-Instrument spielen. Tippe auf Befehl + I, um die App zu profilieren und das Zombies-Instrument auszuwählen (du musst auf dem Simulator laufen). Wenn Sie einen Zombie erhalten, können Sie den gesamten Speicherverlauf (jedes Retain / Release) für dieses Objekt anzeigen, was beim Aufspüren von Fehlern sehr hilfreich ist.





xcode4