9

我正在缩放一个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

4

5 回答 5

11

正如 API 文档所说,您有责任在必要时保留和释放色彩空间。即,如果您需要,请保留它。如果你不保留,不要释放。 在此处阅读有关它的更多信息

于 2011-03-11T06:57:19.040 回答
3

请注意,释放颜色空间对象似乎可能会导致崩溃。我进行了一些挖掘,但无法确定坠机的根本原因。

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

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

这是在 ipad 和 sim 上的 iOS5 上。

我知道,这是最糟糕的错误报告,但是,嘿,如果你遇到同样的问题并开始拔头发(我们做到了),那么也许这可以证实你不是唯一的人打击这种行为。

这个错误:“运行 WebGL 一致性测试时发生随机崩溃”似乎是同一个问题。还是这个

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

--- 戴夫

ps, http: //xkcd.com/979/,对于“这里是龙”的帖子感到抱歉。:)

于 2012-02-14T07:38:49.733 回答
3

管理 CoreFoundation 对象生命周期和其他类似对象(例如 CoreGraphic 对象)的规则是,如果您使用具有名称CreateCopy名称中的函数获取对象,则在完成对象时需要使用适当的释放方法。

由于原始问题中的代码显示 CoreGraphics 对象是使用Get名称中包含的方法获得的CreateCopy因此您不应该在使用后释放该对象。如果你确实发布了,你应该期望得到崩溃。

于 2014-02-23T11:36:35.340 回答
3

同样的问题曾经发生在我身上。我发现,就我而言,问题在于发布以下 ColorSpace:

CGColorSpaceRef colorSpace = CGImageGetColorSpace(pic.CGImage);

在我将该行更改为:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

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

于 2012-07-30T10:29:56.627 回答
1

是的,你必须。

不保留返回CGColorSpaceRef的 from ,正如其名称中的“Get”所暗示的那样。CGImageGetColorSpace然后你会打电话CGColorSpaceRetain(colorSpace)还是不打电话,这是你的电话。

但是,如果您打算对该颜色空间做任何有用的事情(例如创建渐变或其他东西) ,我强烈建议您这样做(当然,稍后发布)。否则,您将陷入各种 CG 功能中随机崩溃的噩梦。

如果您需要将某些 CG 对象传递给其他函数,请始终确保将其保留。总是。

于 2014-09-06T14:41:27.407 回答