2011-01-04 12 views
1

Wenn Sie erstellen eine CGLayer wie so, und bekommt dann den Kontext ... es scheint die CGContextRef zu Release unmöglich zu sein?Es kann keine CGContextRef (im Kontext von einem CGLayer ist) freizugeben

Freigeben der CGLayerRef selbst (anscheinend) funktioniert gut.

Sie würden denken, Sie könnten den CGContextRef freigeben, kurz bevor Sie den CGLayer freigeben - aber nein? Sie können den CGContextRef auch nicht unmittelbar nach dem Release des CGLayers freigeben.

Wenn Sie den CGContextRef freigeben, 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 vor sich geht? (Beachten Sie außerdem, dass CGContextRelease in der Tat genau das gleiche wie CFRelease ist, mit einigen Nulüberprüfungen.)

Eigentlich sollten Sie CGContextRef nie manuell freigeben? Weiß jemand? Prost.

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

spektakuläre Antwort der Bezug Joel unter:

ist die Freigabe der CGLayerRef richtig und angemessen? Joel hat darauf hingewiesen:
„Ja, da die Funktion, die Sie es sind zu erhalten von in ihrer Unterschrift auf‚Erstellen‘. Siehe: Dokumentation/Corefoundation /“

Antwort

5

Sie den Zusammenhang von CGLayerGetContext zurück nicht selbst, und sollte es nicht freigeben *. Informationen zu Get-Funktionen in Core Foundation finden Sie unter http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/writerid/cfGetRule.

*: zumindest sollten Sie es nicht freigeben, wenn Sie Ihren Beispielcode angeben. Wenn Sie es zuerst beibehalten haben (CGContextRetain (sonderbar)), sollten Sie eine CGContextRelease haben, um es auszugleichen.

+1

Ja, da die Funktion, von der Sie sie erhalten, 'Create' in ihrer Signatur hat. Siehe http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/writerid/cfCreateRule –