无法释放CGContextRef(上下文来自CGLayer)

时间:2011-01-04 12:44:37

标签: iphone cocoa cgcontext cglayer

当您像这样创建 CGLayer ,然后获取上下文... 发布CGContextRef 似乎是不可能的?

释放CGLayerRef本身(显然)可以正常工作。

你认为你可以在发布CGLayer之前释放CGContextRef - 但不是吗?在释放CGLayer之后,你也不能释放CGContextRef。

如果您发布了CGContextRef,应用程序崩溃。

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

有谁知道这里发生了什么? (进一步注意,CGContextRelease确实与CFRelease相同,只有一些零检查。)

实际上你应该从不手动发布CGContextRef吗?有人知道吗?欢呼声。

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

关于乔尔在下面的精彩回答:

释放 CGLayerRef 是否正确?乔尔指出:
“是的,因为您从中获取的功能在其签名中有'创建'。请参阅:documentation / CoreFoundation /”

1 个答案:

答案 0 :(得分:5)

您不拥有从CGLayerGetContext返回的上下文,因此不应该释放它*。特别是,请参阅http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/writerid/cfGetRule以获取有关Core Foundation中“获取”功能的信息。

*:至少,您不应该根据示例代码发布它。如果你先保留它(CGContextRetain(怪异)),那么你应该有一个CGContextRelease来平衡它。