2009-04-16 16 views
3

Kann mir bitte jemand erklären, warum der folgende Code meine App zum Bomben bringt?Freigabe von NSData verursacht Ausnahme

NSData *myImage = UIImagePNGRepresentation(imageView.image); 
    : 
[myImage release]; 

Wenn ich die ‚Freisetzung‘ Zeile aus kommentieren, die App läuft ... aber ein paar Mal die Funktion aufrufen diesen Code enthält, und ich bekomme einen Absturz - Ich denke, durch einen Speicherverlust verursacht.

Auch wenn ich alles andere in der Funktion kommentieren und nur diese zwei Zeilen verlassen, wenn die Version ausgeführt wird, stürzt die App ab.

Ich bin sicher, dass dies ein Neuling sein muss, „Sie wissen nicht, wie Sie Ihren Chaos richtig aufzuräumen“ Art der Sache ;-)

Cheers,

Jamie.

Antwort

4

Sind Sie sicher, dass Sie release anrufen sollte - die allgemeine Regel von MacOS APIs ist, dass Methoden, die Eigentum Copy oder Create in ihrem Namen zu übertragen. Ich vermute, dass Sie einen Verweis auf die zugrunde liegende Bildrepräsentation bekommen und nicht auf eine Kopie. In diesem Fall veröffentlichen Sie ein Objekt, das etwas anderem gehört.

+0

Ja - du hast Recht ... Ich habe den Code noch einmal durchgearbeitet, Code kommentiert und Schritt für Schritt ausgeführt ... Ich sollte ihn nicht veröffentlichen! Danke - das hat mir geholfen, dieses Problem zu lösen. Zeit für mich, die Bücher etwas mehr zu lesen, denke ich :-( – badmanj

+0

Für Methoden sind die Wörter 'alloc',' new' und 'copy' (und' retain', natürlich). Sie denken an Core Foundation Es gibt jedoch die gleiche allgemeine Idee: Wie auch immer, hier ist der obligatorische Link zu den Speicherverwaltungsregeln: http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html –

4

Schauen Sie in die Speicherverwaltung, Sie sollten in der Lage sein, ein paar Threads hier zu finden, oder Sie können einen Blick auf this page werfen. Ich werde hier nicht auf alle Regeln eingehen, aber das grundlegende Problem ist, dass myImage automatisch freigegeben wird, nicht beibehalten - wenn Sie Release manuell aufrufen, wird es nicht mit einem Retain gepaart, wenn die Autorelease versucht, das (jetzt ungültige) Objekt zu entfernen Am Ende der Laufschleife stürzt Ihre Anwendung ab. Durch das Entfernen des Releases wird das Problem behoben, aber es dauert einige Zeit, bis Sie die Regeln zum Zurückhalten/Freigeben kennen. Dies ist eines der wichtigsten Dinge, die Sie verstehen müssen.

+0

Danke - ich werde etwas mehr über das Thema nachlesen - das Problem ist mein grundlegendes Verständnis davon, denke ich! – badmanj

0

Sie sollten dieses Objekt NICHT freigeben! Apple sagt: "Rückgabewert Ein Autoreleased Datenobjekt, das die PNG-Daten enthält, oder Null, wenn beim Erstellen der Daten ein Problem aufgetreten ist." (siehe UIImagePNGRepresentation reference)

Verwandte Themen