有效地修改CGColor

时间:2012-01-19 04:02:27

标签: iphone performance objective-c++ cgcolor

我有一个iPhone应用程序,我通过将它们分解到组件中来“添加”许多CGColors,对组件进行平均,然后使用新组件制作新颜色。当我运行此代码时,Instruments发现我泄漏了大量CGColors,而且应用程序运行缓慢。

我觉得如果有办法在不使用CGColorCreate(色彩空间,组件)的情况下做我正在做的事情,我觉得我可以解决内存泄漏问题。

这是“添加”颜色的代码

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双重自由错误,因为在分配新的drawColor之前,多次调用添加了颜色的方法。有没有办法在我发布之前检查drawColor是否存在?这是新的相关代码。

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

2 个答案:

答案 0 :(得分:4)

非常确定你只需要CGColorRelease(drawColor)来防止泄漏。了解这有助于您的表现。

答案 1 :(得分:0)

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

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

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

CGColor个对象是不可变的,因此您将无法修改现有对象。