Memory leak in CGImage
Habe ich ein Speicherleck, ich weiß einfach nicht, wie zu lösen.
Dies ist die undichte code:
[newImg release];
CGColorSpaceRef d_colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(Data, width,
height,
8, 4*width,
d_colorSpace,
kCGImageAlphaNoneSkipFirst);
UIGraphicsPushContext(context);
CGImageRef new_img = CGBitmapContextCreateImage(context);
UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
new_img];
CGImageRelease(new_img);
CGContextRelease(context);
CGColorSpaceRelease(d_colorSpace);
newImg = convertedImage;
Ich ändern, pixel-Informationen gespeichert, in Daten, die dann mit dieser Methode erstelle ich ein UIImage zurück aus den Daten (die als unsigned char array)
Xcode instruments sagt mir, dass es Lecks in hier:
CGImageRef new_img = CGBitmapContextCreateImage(context);
Und hier:
UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
new_img];
obwohl ich beide von Ihnen 🙁 Kann jemand mir sagen, wie man dieses Problem lösen?
Vielen Dank im Voraus ^-^
Wo sind Sie die Freigabe convertedImage? Auch, warum veröffentlicht Ihr newImg an der Spitze, wenn Sie es später?
newImg ist ein istance-Eigenschaft, so enthält er möglicherweise ein älteres Bild, das ist der Grund, warum ich release es in Erster Linie, weil ich überschreiben Sie ihn mit dem convertedImage. die convertedImage darf nicht veröffentlicht werden, weil es wird gespeichert werden, in der newImg
Sie falsch verstanden habe, wie memory-management arbeitet in Objective C, sollten Sie nur freigeben Objekte, die Sie zuordnen. Siehe mein Beitrag unten
Sie nie nennen UIGraphicsPopContext()
Wenn newImg ist eine Instanz der Eigenschaft, als [newImg release]; nicht funktionieren sollte, denn es sollte selbst.newImg; Oder bin ich da falsch?
newImg ist ein istance-Eigenschaft, so enthält er möglicherweise ein älteres Bild, das ist der Grund, warum ich release es in Erster Linie, weil ich überschreiben Sie ihn mit dem convertedImage. die convertedImage darf nicht veröffentlicht werden, weil es wird gespeichert werden, in der newImg
Sie falsch verstanden habe, wie memory-management arbeitet in Objective C, sollten Sie nur freigeben Objekte, die Sie zuordnen. Siehe mein Beitrag unten
Sie nie nennen UIGraphicsPopContext()
Wenn newImg ist eine Instanz der Eigenschaft, als [newImg release]; nicht funktionieren sollte, denn es sollte selbst.newImg; Oder bin ich da falsch?
InformationsquelleAutor XelharK | 2010-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fast sicher Sie sind nicht die Freigabe
newImg
irgendwo in Ihrem code. Vielleicht sind Sie nicht frei, es in-dealloc
. Wenn das wahr ist, dann Instrumente markieren Sie die Codezeile, die zugewiesenen Speicher. Es nicht wissen, wenn Sie sollte oder sollte nicht veröffentlicht; Sie weiß einfach, wenn der Speicher reserviert wurde und als es befreit war. Sie müssen die audit-Codes aus, wie Sie das geschafft ivar.Das heißt, Sie sind direkt Zugriff auf Ihre ivars, das ist schlecht. Dies ist die #1 Ursache der Probleme mit dem Speicher in ObjC. Verwenden Sie die Eigenschaften und Zugriffsmethoden (außer in
init
unddealloc
), und diese Probleme neigen dazu, Weg zu gehen. (Und konvertieren ARC. Es gibt sehr selten einen Grund für die Verwendung von manuellen beibehalten zählen mehr, besonders auf iOS. Immer noch, auch mit ARC, empfehle ich die Verwendung von Accessoren und nicht berühren Sie Ihre ivars direkt.)Auch: rufen Sie Ihre Immobilie
newImg
. Das Präfixnew
hat eine Besondere Bedeutung in ObjC (es bedeutet, dass das zurückgegebene Objekt haben sollten eine effektive +1 retain count). Dies kann dazu führen Sie Probleme mit dem Speicher und falsch-positiv-Warnungen. Es sollte ein name wieconvertedImage
odernextImage
.InformationsquelleAutor Rob Napier
Edit: Original-Beitrag schien nicht zu helfen, also löschen und neu zu posten.
Versuchen Sie dies:
Getestet haben und es nicht Leck auf mein Ende.
Ich versuchte, die code -, und es führt tatsächlich zu einer null-Zeiger-Ausnahme.. So.. Kann jemand mir bitte helfen? 🙁
InformationsquelleAutor pheelicks
CGBitmapContextCreate wird nicht die Daten freigeben, die Sie ihm geben. Entweder geben Sie NULL (in welchem Falle wird der Kontext auf Ihre eigenen backing-Speicher) oder lösen sich nach der Freigabe der Kontext.
EDIT: hier ist in der entsprechenden Dokumentation.
InformationsquelleAutor Vladimir Gritsenko
Scheint mir, dass Sie nicht loslassen convertedImage Versuchen, ersetzen Sie diese Zeile
mit diesem
in Ihrem code.
Und wenn ich Sie richtig verstehe (basiert auf Kommentare zu Frage) erklären Sie newImg-Eigenschaft, etwa so:
In diesem Fall die synthetisierten Set-Methode für diese Eigenschaft behalten, jedes Objekt, das zugewiesen werden soll. Und lassen Sie es, wenn Sie den Wert ändern.
So sind Sie nicht verantwortlich für die Freigabe es, und Sie sollten entfernen Sie diese Zeile:
Ich denke, das beste, was Sie tun können, ist zu Lesen Advanced Memory Management Programming Guide. Es ist nicht allzu lange und doch es bietet eine vollständige übersicht über die wichtigsten Konventionen, die in iOS memory management.
Und da Sie auch die Arbeit mit CoreFoundation Objekte/Funktionen, betrachten Sie die Memory Management Programming Guide für Core Foundation.
Ich hoffe, es wird helfen 🙂
InformationsquelleAutor FreeNickname