Frage

Wenn Sie a erstellen CGlayer wie so, und dann den Kontext bekommen ... es scheint unmöglich zu sein Lassen Sie die cgContexTref frei?

Die Veröffentlichung des CGlayerRef selbst (anscheinend) funktioniert einwandfrei.

Sie würden denken, Sie könnten das CGContexTref kurz vor der Veröffentlichung des CGlayer veröffentlichen - aber nein? Sie können das CGContexTref nicht gleich nach der Veröffentlichung des CGlayer veröffentlichen.

Wenn Sie das CGContexTref veröffentlichen, stürzt die App ab.

CGLayerRef aether = CGLayerCreateWithContext(
    UIGraphicsGetCurrentContext(), CGSizeMake(1024,768), NULL);
CGContextRef weird = CGLayerGetContext(aether);

// paths, strokes, filling etc
// paths, strokes, filling etc

// try releasing weird here
CGLayerRelease(aether);
// or, try releasing weird here

Weiß jemand, was hier los ist? (Beachten Sie weiter, dass cgContextrelease in der Tat genau das gleiche wie CFrelease ist, wobei einige Null -Checks.)

Sollten Sie CGContexTref nie manuell veröffentlichen? Weiß jemand? Prost.

CGContextRelease(weird); // impossible, not necessary, doesn't work???

In Bezug auf Joels spektakuläre Antwort unten:

Veröffentlicht das CGlayerRef Richtig und richtig? Joel hat darauf hingewiesen:
"Ja, da die Funktion, von der Sie sie erhalten, in seiner Unterschrift" erstellen "hat. Siehe: Dokumentation/CoreFoundation/"

War es hilfreich?

Lösung

Sie besitzen den Kontext nicht, der von CGlayergetContext zurückgegeben wurde, und sollte ihn daher nicht veröffentlichen*. Insbesondere siehe http://developer.apple.com/library/mac/#documentation/corefoundation/conceptual/cfmemorymgmt/concepts/ownership.html#//apple_ref/doc/writerid/cfgetrule Informationen zu "Get" -Funktionen in der Core Foundation.

*: Zumindest sollten Sie es angesichts Ihres Beispielcode nicht veröffentlichen. Wenn Sie es zuerst beibehalten haben (cgcontextretain (seltsam)), sollten Sie eine CGContextrelease haben, um es auszugleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top