【问题标题】:Does the result of CGImageGetColorSpace(image) have to be released?CGImageGetColorSpace(image) 的结果是否必须发布?
【发布时间】:2023-03-04 11:04:02
【问题描述】:

我正在缩放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 时,网络上的示例完全错误

【问题讨论】:

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


    【解决方案1】:

    正如 API 文档所说,您有责任保留并在必要时释放颜色空间。 IE。如果需要,请保留它。如果你不保留,不要释放。 Read more about it here

    【讨论】:

    • 是的,好像是这样。这是关于核心基础的获取/创建的 Apple 文档:link
    【解决方案2】:

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

    我们有一个应用程序从它处理的每个位图的颜色空间中读取字段,并会调用 [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

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

    --- 戴夫

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

    【讨论】:

    • 我在 iOS 5.x 设备上以非常可重复的方式得到了这个,而在具有完全相同代码的 iOS 6 设备上则完全没有。所以看起来这个问题可能会在 iOS 6 上得到修复。(如果重要的话,这是一个支持 ARC 的项目)xkcd 参考 +1。
    • 我在 iOS 7 测试版和通用版上都遇到了完全相同的问题。请提供您迄今为止找到的有关如何解决此问题的任何信息。谢谢
    【解决方案3】:

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

    CGColorSpaceRef colorSpace = CGImageGetColorSpace(pic.CGImage);
    

    在我将该行更改为:

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    

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

    【讨论】:

    • 那是我的问题(在 iOS 5 中,iOS 6 似乎工作正常)。感谢您的指点 - 为我节省了很多烦恼!
    • 在 Cocoa 中命名事物的方式意义重大。您的第一行使用了“Get”,这并不意味着所有权,因此不保留返回的 CGColorSpaceRef。你需要这样做。第二行有“创建”,这意味着它将被保留,因此您不需要这样做。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      是的,你必须这样做。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 2016-10-09
        • 2016-05-21
        • 2013-11-24
        • 2013-02-16
        相关资源
        最近更新 更多