高效修改CGColor

Posted

技术标签:

【中文标题】高效修改CGColor【英文标题】:Efficiently Modifying CGColor 【发布时间】:2012-01-19 04:02:26 【问题描述】:

我有一个 iPhone 应用程序,我在其中“添加”许多 CGColors,方法是将它们分解为它们的组件,平均组件,然后用新组件制作新颜色。当我运行这段代码时,Instruments 发现我泄漏了很多 CGColors,并且应用程序运行缓慢。

如果有一种方法可以在不使用 CGColorCreate(colorspace, components) 的情况下完成我正在做的事情,我觉得我可以解决内存泄漏问题。

这是颜色“添加”的代码

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 是否存在?这是新的相关代码。

CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
CGColorRelease(drawColor);
drawColor=CGColorCreate(colorSpace, components);
CGColorSpaceRelease(colorSpace);

【问题讨论】:

【参考方案1】:

很确定您只需要CGColorRelease(drawColor) 即可防止泄漏。看看这对您的表现有何帮助。

【讨论】:

嘘!注意CGColorSpaceCreateDeviceRGB ;) 谢谢,贾斯汀。我查了一下,现在我正在释放我正在在线分配的 CGColorSpaceRef。有没有办法给 cmets 投票?【参考方案2】:

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

CGColorRelease(drawColor);
drawColor=CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);

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

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

【讨论】:

感谢您的回答。在使用 CGContextSetStrokeColorWithColor(context, color) 将其分配给上下文后,我将释放 CGColor。那会完成同样的事情,不是吗?我现在无法测试您的建议,但我稍后会测试。 我不认为我可以编辑评论,但你是对的。我正在泄漏颜色,因为分配 drawColor 的方法比 drawRect: 释放颜色的方法发生得更频繁。感谢您指出了这一点;有机会我会测试一下。 无论您或任何人是否对我编辑的问题有答案,我都找到了放置 CGColorReleases 的地方。感谢您的帮助。

以上是关于高效修改CGColor的主要内容,如果未能解决你的问题,请参考以下文章

我的jdk源码:StringBuilder 高效可多次修改String

使用VS调试高效修改代码(poj 3984为例)

IDEA高效运用技巧

Entity Framework Core 7中高效地进行批量数据插入

高效的工作流引擎,让企企管理云赋予更多协同属性

es索引字段类型错误如何高效解决(如何修改es索引字段类型)