2012-04-04 15 views
16

Also bin ich Debuggen einer App in Vorbereitung für seine App so Release, und ich habe einen universellen Haltepunkt für "Alle Ausnahmen" aktiviert. Seitdem laufen jedes Mal wenn ich die App, die Konsole druckt:Haltepunkt mit dem Hinweis "objc_autoreleaseNoPool"

Catchpoint 2 (throw) Bis Stützpunkt 1 - "objc_exception_throw" aufgelöst

objc [11765]: Object 0x8f18ff0 der Klasse __NSCFLocale ohne Autoreleased Pool an Ort und Stelle - nur undicht - bricht auf objc_autoreleaseNoPool()

objc [11765] zu debuggen: Object 0x8f190a0 der Klasse __NSCFNumber ohne Pool anstelle Autoreleased - nur undicht - brechen auf objc_autoreleaseNoPool() zu debuggen

objc [11765]: Object 0x8f1fef0 der Klasse __NSCFLocale ohne Pool anstelle Autoreleased - nur undicht - Pause auf objc_autoreleaseNoPool()

Wörtlich gedruckt 3 mal zu debuggen. Ich habe keine Ahnung, was das bedeutet, aber es sieht schlecht aus. Jeder Rat würde geschätzt werden.

+0

Haben Sie einen Autorelease-Pool? und überprüfe die App auf Lecks mit einem der Hilfsprogramme, die du in xcode findest (profiliere es) – chikuba

+0

Ich benutze keine Autorelease-Pools. Ehrlich gesagt, verstehe ich nicht, warum du einen benutzen würdest, also habe ich es nie getan. Aber ich werde das versuchen – Andrew

+0

Es zeigt sich vor der App del. endet, aber ich habe Zeile für Zeile die ganze Sache auskommentiert, und ich lecke immer noch Objekte. Jeder Gedanke? – Andrew

Antwort

35

Neue Info

ich bestimmen, wo mein Problem liegt, indem ein umgestellt Autofreigabeverfahren zu schaffen.

Ich empfehle das, wenn Sie nicht wissen, was Sie tun, aber das ist, was ich herausgefunden habe.

NSThread erstellt seinen eigenen Thread, die aufgerufene Methode sollte in einen Autorelease-Pool gehüllt werden.

Grand Central Dispatch kümmert sich bei der Verwendung der Befehle "dispatch _..." um die Anpassung über den Autorelease-Pool. wenn Sie jedoch manuell versenden. Vielleicht möchten Sie es in einen Autorelease-Pool einbinden.

Auch behandelt ARC nicht lassen Sie wissen, dass eine Autorelease außerhalb eines Pools passieren wird.

Daher, wenn Sie ARC verwenden und wissen, dass Sie außerhalb des Autorelease-Pools sein werden. Und daran kann man nichts ändern. Sie werden alle Komfortmethoden vermeiden wollen.

verwenden Sie dies.

[[NSString alloc] initWithFormat:@"%@",myObject]; 

anstelle diesen

[NSString stringWithFormat:@"%@",myObject]; 

dieser wird dem Bogen-System ermöglichen zu halten und loslassen, aber die zugrunde liegende Autofreigabe durch die bequeme Methode durchgeführt wird übersprungen, da Sie nicht die bequeme Methode verwendet werden.

Hoffe, dass hilft.

Original-Antwort

Ok, ich nicht diese Frage fühlen mit detailliert genug beantwortet.

die Nachricht präsentiert wurde

objc[1310]: Object 0x34f720 of class SimpleKeychain autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 

Der Debugger zeigt eine mögliche Bruchstelle aus, dass Sie die Situation debuggen helfen. Nun, während dieser Breakpoint wirklich wenig geholfen hat, die Situation zu debuggen. Ich denke, es ist wichtig zu wissen, wie man diesen Breakpoint dem Debugger hinzufügt und so habe ich die Zeit damit verbracht, daran zu basteln (nachdem ich das Internet durchforstet und nichts gefunden habe), bis ich diesen Fehler behoben habe.

Es ist irgendwie ärgerlich, dass die Unterbrechung bei allen Fehlern dies nicht erfasst, aber hier sind die Schritte zum Hinzufügen des Haltepunkts zum Debugger.

erste, was Sie tun möchten, ist der Haltepunkt Navigator

navigator toolbar

Debugger auswählen, indem

breakpoint button

nächste auf dieser Registerkarte klicken schauen Sie in Richtung der Unterseite des Navigatorfenster und Drücken Sie die Plus-Taste

Add Exception Breakpoint

Damit können Sie manuell einen Haltepunkt hinzufügen.

Ich wählte einen C++ - Haltepunkt und gab den Namen der Nachricht in das Textfeld name ein.

Adding custom C++ exception

nach dieser Ausnahme Zugabe es in der Tat Pause tat.

Allerdings kann dies für Sie als objektiver c Entwickler nützlich sein oder auch nicht. Dies brach in den Assembler-Code ein.

assembly code at achieved breakpoint.

Leider zeigte es nur diesen Punkt auf den Call-Stack für den Thread.

Thread list

Und es stellte sich heraus, dass der Autofreigabe Problem, weil eine Klasse namens Autofreigabe in einem dispatch_once Anruf war. und weitere Untersuchung ergab, dass die + (void) Last; Methode auf der Klasse wurde vor allem anderen aufgerufen.Dies geschieht über die Funktion call_load_methods und außerhalb des Threads der Hauptmethode.

Error Call and Stack

dies zu korrigieren, habe ich nur den Autofreigabepool Wrapper um den Anruf.

updated error call

eine andere Lösung in der + (void) Last sein kann, den Autofreigabepool hinzuzufügen; Methode. aber das war genug für meine Zwecke.

HINWEIS: Ich füge das hier zum Beitrag hinzu, weil ich nicht gerne ein Problem finde und nicht in der Lage bin, alle Wege zu der resultierenden Antwort herauszufinden. Wenn der Debugger Ihnen sagt, dass Sie einen Breakpoint zu der aufgelisteten Funktion hinzufügen sollen, sollte es irgendwo Informationen geben, um diese Informationen zu erhalten. Hoffentlich wird dies die Frustration einiger derer, die versuchen, diese Antwort zu finden, verringern.

+1

Schreckliche Antwort. Danke, dass Sie sich die Zeit genommen haben, diesen Beitrag zusammenzustellen. – Andrew

+1

Dito. Dieses Breakpoint-Ding war eine große Hilfe, obwohl mein Problem ein ganz anderes war. Danke, dass du dir die Zeit genommen hast. –

+1

FYI, nicht sicher, ob der Name der Ausnahme geändert wurde oder weil meins in einem objc und nicht in einer objC++ - Datei war, aber ich musste den Breakpoint auf __NSAutoreleaseNoPool anstelle von objc_autoreleaseNoPool setzen. Hoffe, dass das irgendwann hilft. Der ursprüngliche Beitrag war jedoch sehr hilfreich. – stuckj

1

Viele der Methoden in der Kakao API geben automatisch freigegebene Objekte zurück. Insbesondere die Methoden, die ein Objekt zurückgeben, das nicht mit init beginnt, z. B. [NSNumber numberWithLong:]. Wenn kein Autorelease-Pool vorhanden ist, werden diese Objekte durchgelassen. Weitere Informationen zur Verwendung von NSAutoreleasePool finden Sie im documentation.

+0

Was bedeutet das? Was kann ich tun, um dieses Problem zu beheben? – Andrew

+0

Danke. Ich werde es untersuchen – Andrew

+0

nur eine in die Haupt, wo Sie die App starten und Sie müssen nicht darüber nachdenken und nur die Schönheit, die Objekte automatisch freigegeben ist :) – chikuba

1

Es bedeutet, dass Sie einen Autorelease-Pool auf dem Thread erstellen müssen, der passiert. Andernfalls werden Ihre zugewiesenen Objekte nicht zerstört (wie von der Nachricht vorgeschlagen). Also, brechen/pausieren Sie am Symbol, gehen Sie dann den Stapel zu Ihrem Thread (oder Programm) -Eintrag und fügen Sie einen Autorelease-Pool hinzu. Das ist alles.

+0

Es zeigt sich vor der App del. endet, aber ich habe Zeile für Zeile die ganze Sache auskommentiert, und ich lecke immer noch Objekte. Jeder Gedanke? – Andrew

+0

müssen Sie einen Autorelease-Pool hinzufügen. früher in der Ausführung als der Ausführungspunkt, wo der Haltepunkt getroffen wird. Wenn es in Ihrem Hauptthread ist, fügen Sie einen Autorelease-Pool zu 'int main() 'hinzu (Hinweis: Ihre Projektvorlage hätte dies wahrscheinlich für Sie erledigt). Andernfalls würden Sie es normalerweise in Ihrem Thread-Eintrag hinzufügen. – justin