iPhone应用程序释放CGColorSpaceRef时崩溃

3

我正在使用CGColorSpaceRef,但是当我释放它时,程序会崩溃。 以下是我创建和释放的方式:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

完成某些任务后,然后释放资源。

CGColorSpaceRelease(colorSpace);

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

我们必须按照苹果文档的要求发布此内容:https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGColorSpace/Reference/reference.html - josh
2
CGColorSpaceCreateXXX 之后使用 CGColorSpaceRelease 是正确的。因此问题必须出在这些调用之间你所做的事情上。 - Martin R
3个回答

4

看起来你已经过度释放了colorspace对象。我刚刚运行了以下程序,得到了你引用的错误信息。

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

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

这个错误代码SIGABRT会导致以下错误:

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

如果我只调用CGColorSpaceRelease一次,程序可以编译和运行而没有错误。

静态分析器(Shift-Cmd-B)可能能够展示你哪里出错了。在第二个CGColorSpaceRelease调用时,它肯定会标记上面的代码为“释放后使用引用计数对象”。


我同意你的看法!问题在于当它被一遍又一遍地调用时,但有没有办法在Colorspace上找到保留计数器,以便当它= 0时,我就不会释放colorspace? - josh
2
你可以使用 CFGetRetainCount(colorspace) 来获取保留计数,但是,在使用之前,你应该查看 https://web.archive.org/web/20160111073519/http://whentouseretaincount.com/(别忘了向下滚动)。你将遇到的问题是,`colorspace` 变量在创建后立即保留计数为 2,在释放后为 1,但如果再次释放它,你将会得到错误。 - mttrb
根据Nenad找到的文章,您可能只需不发布“colorspace”并忍受内存泄漏。 - mttrb

1

您实际上负责根据需要保留和释放颜色空间!即,如果需要,请保留它。如果不需要保留,请勿释放!有关此主题的更多信息,请参阅文档:Core Foundation内存管理编程指南

更新:

关于我们的帖子遇到的奇怪错误,请查看ddopsons的发帖这里。不幸的是,没有提供解决方案,但提供了可能的解决方法。


一个依赖于设备的RGB颜色空间。您需要通过调用CGColorSpaceRelease来释放此对象。如果失败,则返回NULL。 请参阅此链接https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGColorSpace/Reference/reference.html - josh
CGColorSpaceCreateDeviceRGB 增加保留计数! - josh
2
@Nenad Mihajlovic,我不确定您想表达什么。您引用的文档说,您拥有带有“create”名称的函数返回的对象。CGColorSpaceCreateDeviceRGB()中有“create”名称。因此,OPs的假设他们需要释放颜色空间是正确的。 - mttrb
确实,OP的假设是正确的,这使得我的回答可能毫无意义!但我开始搜索OP遇到的这个奇怪错误,并找到了以下内容请参见此处。向下滚动到ddopsons的答案并查看链接。 - Nenad M
@NenadMihajlovic 不错的发现!也许你应该在原回答中提及你的发现 :) - mttrb

-3

您正在尝试释放一个常量值。无法完成此操作。


据苹果文档提到,应该进行发布。https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGColorSpace/Reference/reference.html - josh
如果您是正确的,返回值是一个常量,那么 CGColorSpaceCreateDeviceRGB() 函数就不遵循苹果的核心基础内存管理规则。您能提供参考资料,证明它是一个常量吗? - mttrb
是的,它在您的错误消息中:断言失败:(!state->is_singleton) - deleted_user
@stackmonster 这仅仅意味着返回的对象可能是一个单例。即使它是单例,调用 CGColorSpaceRelease 应该是一个无操作。看起来很不可能苹果会编写一个库,如果您尝试释放对象就会崩溃,因为内存管理规则(在函数名称中创建)和 CGColorSpaceCreateDeviceRGB 的文档明确表示:“通过调用 CGColorSpaceRelease 您负责释放此对象。” - mttrb
NSAssertionFailure如何成为“noop”? - deleted_user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接