【问题标题】:Iphone app crash when releasing CGColorSpaceRef释放 CGColorSpaceRef 时 Iphone 应用程序崩溃
【发布时间】:2023-03-21 09:05:02
【问题描述】:

我正在使用CGColorSpaceRef,当我释放它时,它崩溃了。 我创建和发布的方式

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

做完一些任务然后释放

CGColorSpaceRelease(colorSpace);

编译器显示的错误是 “断言失败:(!state->is_singleton),函数 color_space_state_dealloc,文件 ColorSpaces/CGColorSpace.c,第 127 行” 当我不释放色彩空间或将其设置为零时,会发生奇怪的事情,我不知道为什么会这样。 请帮助我。提前致谢。 祝您有愉快的一天。

【问题讨论】:

标签: iphone objective-c xcode color-space


【解决方案1】:

您似乎已经过度释放了 colorspace 对象。我刚刚运行了以下程序,并收到了您引用的错误消息。

int main(int argc, char *argv[]) {
    @autoreleasepool {
        CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();

        CGColorSpaceRelease(colorspace);
        CGColorSpaceRelease(colorspace);
    }
}

这个SIGABRTs 出现以下错误:

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

如果我只在程序编译并运行时没有错误地调用CGColorSpaceRelease。

静态分析器 (Shift-Cmd-B) 很可能会显示您是否出错了。它肯定会在第二次CGColorSpaceRelease 调用中将上述代码标记为“释放后使用引用计数对象”。

【讨论】:

  • 同意你的看法!问题是当它被一次又一次地调用但有什么方法可以在颜色空间上找到保留计数器以便它 = 0 然后我不会释放颜色空间?
  • 您可以使用CFGetRetainCount(colorspace) 来获取保留计数,但是,您应该在使用它之前看到web.archive.org/web/20160111073519/http://…(不要忘记向下滚动)。您将遇到的问题是 colorspace 变量在创建后立即保留计数为 2,释放后为 1,但如果再次释放它,则会出现错误。
  • 鉴于 Nenad 发现的帖子,您可能只需要不释放 colorspace 并忍受内存泄漏。
  • 感谢 mttrb,祝您有美好的一天。
【解决方案2】:

如果/必要,您实际上负责保留和释放色彩空间! IE。如果需要,请保留它。不需要保留就不要释放!有关此主题的更多信息,请参阅文档:Memory Management Programming Guide for Core Foundation

更新:

关于我们的海报在上面遇到的有线错误,请查看 ddopsons 发布的here。不幸的是,没有提供解决方案,而是一种可能的解决方法。

【讨论】:

  • 依赖于设备的 RGB 颜色空间。您负责通过调用 CGColorSpaceRelease 释放此对象。如果不成功,则返回 NULL。看到这个链接developer.apple.com/library/mac/#documentation/graphicsimaging/…
  • CGColorSpaceCreateDeviceRGB 增量保留计数!
  • @Nenad Mihajlovic 我不确定您要表达什么观点。您引用的文档说您拥有名称中带有 create 的函数返回的对象。 CGColorSpaceCreateDeviceRGB() 已在名称中创建。因此,他们需要释放色彩空间的 OP 假设似乎是正确的。
  • 确实,OPs 的假设是正确的,这让我的回答可能毫无意义!但是我开始搜索 OP 的这个奇怪错误,并找到了以下see here。向下滚动到 ddopsons 答案并查看链接。
  • @NenadMihajlovic 不错的发现!也许您应该参考您的发现来更新您的原始答案:)
【解决方案3】:

您正试图释放一个常量值。做不到

【讨论】:

  • 这在苹果文档中提到它应该被释放。 developer.apple.com/library/mac/#documentation/graphicsimaging/…
  • @stackmonster 如果返回值是一个常量是正确的,那么CGColorSpaceCreateDeviceRGB() 函数没有遵循 Apple 的 Core Foundation 内存管理规则。您能否提供一个参考,说明您为什么认为它是一个常数?
  • 是的,它在您的错误消息中:断言失败:(!state->is_singleton),
  • @stackmonster 这只是表明返回的对象可能是单例。即使它是一个单例,调用CGColorSpaceRelease 应该实际上是一个noop。如果您尝试在给定内存管理规则(在函数名称中创建)和CGColorSpaceCreateDeviceRGB 的文档中明确指出“您有责任通过调用 CGColorSpaceRelease。”
  • NSAssertionFailure 如何成为“noop”?
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 2011-06-20
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 2014-06-19
相关资源
最近更新 更多