首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效修改CGColor

高效修改CGColor
EN

Stack Overflow用户
提问于 2012-01-19 12:02:27
回答 2查看 1.9K关注 0票数 2

我有一个iPhone应用程序,我将大量的CGColors“添加”在一起,方法是将它们分解成组件,取平均值,然后用新组件生成新的颜色。当我运行这段代码时,仪器发现我泄漏了大量的CGColors,应用程序运行缓慢。

我觉得如果有一种方法可以做到我正在做的事情,而不是每次都使用CGColorCreate(色彩空间,组件),我就可以解决内存泄漏问题。

这是颜色“添加”的代码。

代码语言:javascript
复制
const CGFloat *cs=CGColorGetComponents(drawColor);
const CGFloat *csA=CGColorGetComponents(add->drawColor);
CGFloat r=(cs[0]*w+csA[0]*aW)/1;
CGFloat g=(cs[1]*w+csA[1]*aW)/1;
CGFloat b=(cs[2]*w+csA[2]*aW)/1;
CGFloat components[]={r, g, b, 1.f};
drawColor=CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);

任何帮助都会非常感谢,即使帮助是“减少添加颜色的频率”。我确信我不是唯一一个试图修改CGColors的人。

编辑:所以,rob的评论让我走上了正确的道路,但我得到了malloc double free错误,因为在分配新的drawColor之前,带有颜色添加的方法会被多次调用。有没有办法在我发布drawColor之前检查它是否存在?以下是新的相关代码。

代码语言:javascript
复制
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
CGColorRelease(drawColor);
drawColor=CGColorCreate(colorSpace, components);
CGColorSpaceRelease(colorSpace);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-19 12:27:32

如果您正在泄漏CGColor对象,那么解决问题的第一步就是停止泄漏它们。处理完颜色对象后,需要调用CGColorRelease。例如,您显然在示例代码中泄漏了drawColor对象。您应该这样做:

代码语言:javascript
复制
CGColorRelease(drawColor);
drawColor=CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);

在将新对象分配给drawColor之前释放由drawColor引用的旧对象。

CGColor对象是不可变的,因此您不能只修改现有的对象。

票数 0
EN

Stack Overflow用户

发布于 2012-01-19 12:25:51

我很确定你只需要通过CGColorRelease(drawColor)来防止泄漏。看看这对你的表现有何帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8920865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档