imageWithCGImage und Speicher
Wenn ich [UIImage imageWithCGImage:]
vorbei in eine CGImageRef
muss ich dann die CGImageRef
oder nicht UIImage kümmern sich, wenn es freigegeben wird?
Die Dokumentation ist nicht ganz klar. Er sagt "Diese Methode nicht im cache des Bild-Objekts."
Ursprünglich rief ich CGImageRelease
auf die CGImageRef nach der übergabe an imageWithCGImage:
aber das verursacht eine malloc_error_break
Warnung in den Simulator, die behaupten, ein double-free passierte.
InformationsquelleAutor der Frage Adam Ernst | 2009-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Stimme mit Ihnen-die Dokumentation ist verworren, am besten für diese API. Basierend auf Ihren Erfahrungen, dann würde ich daraus schließen, dass Sie verantwortlich sind für die Lebensdauer sowohl Objekte, die
UIImage
und dieCGImageRef
. Auf top von, dass Sie haben, um sicherzustellen, dass die Lebensdauer derCGImageRef
ist mindestens so lang wie dieUIImage
(aus offensichtlichen Gründen).InformationsquelleAutor der Antwort fbrereto
Entsprechend der grundsätzliche Regel von Cocoa memory managementeine Besitz-Objekt freigeben müssen, der Eigentum Objekt, wenn Sie es nicht mehr benötigt. Andere Objekte sind verantwortlich für die Aufnahme und Freisetzung der Besitz auf Ihren eigenen. Wenn ein
UIImage
muss ein Objekt zu persistieren, aber nicht behalten oder zu kopieren, es ist ein Fehler inUIImage
's Umsetzung und sollte als solcher berichtet werden.InformationsquelleAutor der Antwort outis
Ich habe das gleiche problem in XCode 3.2.1 auf Snow Leopard. Ich habe so ziemlich den gleichen code wie Jason.
Ich habe mir die iPhone Beispielcode verwendet
imageWithCGImage
und Sie immer lassen Sie dieCGImageRef
mitCGImageRelease
nach einem AufrufimageWithCGImage
.So, ist das ein Fehler im simulator? Ich bekomme immer die
malloc_error_break
Warnung auf der Konsole, wenn ichCGImageRelease
.InformationsquelleAutor der Antwort Lextar
Eigentum in
UIImage
überCGImage
ist unklar. Wie es scheint, nicht kopieren Sie dieCGImage
aber es ist nicht garantiert durch die Dokumentation. Also wir handhaben müssen, dass uns selbst.Habe ich eine neue Unterklasse von
UIImage
dieses problem zu behandeln. Nur die Beibehaltung vorbeiCGImage
und loslassen, wenn diedealloc
.Hier ist Probe.
Weil die
CGImage
zurückgegeben-[UIImage CGImage]
Eigentum ist nicht sichergestellt, dass gleicheCGImage
ging Sie in den init-Methode der Klasse speichertCGImage
getrennt.InformationsquelleAutor der Antwort Eonil
Sind Sie mit Xcode 3.1 auf Snow Leopard? Ich bin mit dem gleichen Problem:
Ich vermute, dass die Aktualisierung auf Xcode 3.2 das Problem zu beheben.
InformationsquelleAutor der Antwort Jason
Nicht sicher, ob das hilft, aber ich hatte ein ähnliches problem.
Ich lese die Antworten und habe dann die folgende, die scheint es behoben:
Verwendet habe ich das autorelease wie vorgeschlagen, aber es war nicht genug.
Ich habe dazu das Bild auf der UIImageView, die ich dann veröffentlicht die cgImage.
Es nicht zum Absturz freigegeben schön. Warum-ich habe keine Ahnung, aber es funktionierte.
Asset Miniaturansicht Teil ist von der ALAsset Bibliothek durch die Art und Weise, müssen Sie möglicherweise noch etwas anderes gibt.
InformationsquelleAutor der Antwort Ben
<>
Nicht meiner Meinung nach. Ich hatte das gleiche problem. Gemäß der Dokumentation
imho hält alle Referenzen korrekt. Wenn Sie eine CGDataProvider bitte haben Sie einen Blick auf
CGDataProviderReleaseDataCallback
und legen Sie einen Haltepunkt in Ihrem Rückruf. Sie können sehen, dass wird richtig aufgerufen, nachdem Sie [release] Ihr Bild und Sie können kostenlos() Ihre Bild-Daten-Puffer gibt.
InformationsquelleAutor der Antwort christian
Also das UIImage nehmen, das Eigentum, und daher sollten Sie nicht lassen Sie die CGImageRef.
InformationsquelleAutor der Antwort lbsweek