Ich skaliere ein CGImageRef
. Ich habe verschiedene Code-Beispiele im Web gefunden, die wie folgt beginnen:
Wie Sie oben sehen können, wird colorspace
freigegeben. Wenn ich das tue, funktioniert mein Code meistens, stürzt aber ab und zu ab, weil diese Farbrauminstanz manchmal schon weg ist. Die API-Dokumentation sagt:
Sie sind dafür verantwortlich, den Farbraum nach Bedarf beizubehalten und freizugeben.
Heißt das, ich muss es freigeben? Ich nahm die Konvention an, dass nur Ergebnisse von Aufrufen mit " Create
" im Namen Objekte zurückgeben, die explizit freigegeben werden müssen. Bedeutet das, dass die Beispiele im Web einfach falsch sind, wenn Sie CGColorSpaceRef
freigeben?
Wie die API-Dokumentation sagt, sind Sie dafür verantwortlich, beizubehalten und den Farbraum nach Bedarf freizugeben. I.e. Wenn Sie brauchen, behalten Sie es. Wenn Sie nicht behalten, nicht freigeben. Lesen Sie hier mehr darüber
Beachten Sie, dass ein Absturz beim Freigeben des Farbraumobjekts möglich ist. Ich habe etwas gegraben, konnte aber die Ursache des Absturzes nicht feststellen.
Wir haben eine App, die Felder aus dem Farbraum jeder Bitmap liest, die sie behandelt, und würde [UIImage imageName] gefolgt von CGImageGetColorSpace gefolgt von CGColorSpaceRelease aufrufen. Und in einem bestimmten Szenario würde es dies mehrmals hintereinander für dasselbe Bild tun. Nicht deterministisch würde dies manchmal mit dem folgenden Fehler während der CGColorSpaceRelease abstürzen:
%Vor%Dies war auf iOS5 auf dem iPad und der SIM.
Ich weiß, dies ist die schlimmste Art von Fehlerbericht, aber hey, wenn Sie auf dasselbe Problem stoßen und anfangen, sich die Haare auszuziehen (was wir getan haben), dann kann dies vielleicht als Bestätigung dienen, dass Sie nicht die einzige sind Person, um dieses Verhalten jemals zu treffen.
Dieser Fehler: "zufälliger Absturz beim Ausführen von WebGL-Konformitätstests" scheint so zu sein könnte das gleiche Problem sein. Oder dieses hier .
Die Lösung bestand darin, die Farbraumdaten nicht mehr zu lesen. Immer noch nicht ganz sicher, was falsch lief. Entschuldigung, ich wünschte, ich könnte mehr Infos geben.
--- Dave
ps., Ссылка , und Entschuldigung für den Beitrag "here be dragons". :)
Dasselbe Problem ist mir immer wieder passiert. Ich fand heraus, dass das Problem in meinem Fall die Freigabe des folgenden ColorSpace war:
%Vor%Nachdem ich diese Zeile zu:
geändert habe %Vor%alles funktioniert wie vorher, außer dem Fehler :)
Die Regel zum Verwalten von CoreFoundation-Objekten und anderen Objekten wie zB CoreGraphic-Objekten lautet, dass Sie das entsprechende Release verwenden müssen, wenn Sie das Objekt mithilfe einer Funktion mit dem Namen Create
oder Copy
erhalten haben Methode, wenn Sie mit dem Objekt fertig sind.
Da der Code in der ursprünglichen Frage zeigt, dass das CoreGraphics-Objekt mit einer Methode mit Get
im Namen und nicht mit Create
oder Copy
erhalten wurde, sollten Sie das Objekt NICHT freigeben, nachdem Sie es verwendet haben. Wenn Sie freigeben, sollten Sie mit Abstürzen rechnen.
Ja, du musst.
Das zurückgegebene CGColorSpaceRef
von CGImageGetColorSpace
wird nicht beibehalten, da sein "Get" im Namen bedeutet. Und es ist dein Anruf, dann rufst du CGColorSpaceRetain(colorSpace)
an oder nicht.
Allerdings bitte ich stark Sie dazu zu drängen (und später natürlich zu veröffentlichen), wenn Sie beabsichtigen, etwas Nützliches mit diesem Farbraum zu tun (z. B. einen Farbverlauf oder etwas erstellen). Wenn Sie dies nicht tun, werden Sie sich zu einem Albtraum von zufälligen Abstürzen in verschiedenen CG-Funktionen einladen.
Wenn Sie ein CG-Objekt benötigen, das an andere Funktionen übergeben werden soll, stellen Sie immer sicher, dass es beibehalten wird. Immer.
Tags und Links objective-c cocoa memory-management core-graphics cgcolorspace