是否必须释放CGImageGetColorSpace(图像)的结果?

时间:2011-03-11 06:43:33

标签: objective-c cocoa memory-management core-graphics cgcolorspace

我缩放CGImageRef。我在网上发现了各种代码示例,如下所示:

CGColorSpaceRef colorspace = CGImageGetColorSpace(image); // "Get" color space

CGContextRef context = CGBitmapContextCreate(NULL, width, height,
    CGImageGetBitsPerComponent(image),
    CGImageGetBytesPerRow(image),
    colorspace,
    CGImageGetAlphaInfo(image));

CGColorSpaceRelease(colorspace); // Really?

如上所示,colorspace已发布。但是,当我这样做时,我的代码大部分时间都在工作,但偶尔崩溃一次,因为有时那个色彩空间实例已经消失了。 API文档说:

  

您有责任根据需要保留和释放色彩空间。

这是否意味着必须发布它?我假设惯例是只有名称中带有“Create”的调用的结果才会返回必须明确释放的对象。这是否意味着在发布CGColorSpaceRef时网络上的示例只是错误

5 个答案:

答案 0 :(得分:10)

正如API文档所说,您负责保留并根据需要释放颜色空间。即如果你需要,保留它。如果您不保留,请不要释放。 Read more about it here

答案 1 :(得分:3)

请注意,似乎可能会因释放colorspace对象而崩溃。我做了一些挖掘,但无法确定崩溃的根本原因。

我们有一个应用程序正在从它处理的每个位图的颜色空间中读取字段,并调用[UIImage imageName],然后调用CGImageGetColorSpace,然后调用CGColorSpaceRelease。并且在某个场景中,对于同一图像,它会连续多次执行此操作。非确定性地,这有时会在CGColorSpaceRelease期间因以下错误而崩溃:

Assertion failed: (!state->is_singleton), function color_space_state_dealloc, file ColorSpaces/CGColorSpace.c, line 127.

这是在ipad和sim上的iOS5上。

我知道,这是最糟糕的错误报告,但是嘿,如果你遇到同样的问题并开始拉头(我们做了),那么也许这可以作为确认你不是唯一的这个行为的人。

这个错误:"random crash while running WebGL conformance tests"似乎可能是同一个问题。或this one

我们的解决方法是停止读取色彩空间数据。还不太清楚出了什么问题。对不起,希望我能提供更多信息

---戴夫

p.s。,http://xkcd.com/979/,并抱歉“这里是龙”的帖子。 :)

答案 2 :(得分:3)

同样的问题曾经发生在我身上。我发现,在我的情况下问题是释放以下ColorSpace:

CGColorSpaceRef colorSpace = CGImageGetColorSpace(pic.CGImage);

我将该行更改为:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

一切都像以前一样工作,除了错误:)

答案 3 :(得分:3)

管理CoreFoundation对象生命周期和其他类似对象的规则,例如,CoreGraphic对象,如果您使用名称中包含CreateCopy的函数获取对象,那么您需要完成对象后,使用适当的释放方法。

由于原始问题中的代码显示CoreGraphics对象是使用名称中Get而不是CreateCopy的方法获得的,因此您不应该在之后释放对象使用它。如果你发布了,你应该会发生崩溃。

答案 4 :(得分:1)

是的,你必须这样做。

未保留CGColorSpaceRef中返回的CGImageGetColorSpace,因为其名称中的“获取”意味着。这是你的电话,然后你会打电话给CGColorSpaceRetain(colorSpace)

但是,如果您打算对该颜色空间执行任何有用的操作(例如创建渐变或其他内容),我强烈强烈要求您(以及稍后发布)。如果你不这样做,你会邀请自己在各种CG功能中随机崩溃的噩梦。

如果你需要将一些CG对象传递给其他一些函数,请务必保留它。总是