我有一个iPhone应用程序,通过将它们分解成各个分量,平均分量,然后用新的分量制作新的颜色,来“添加”许多CGColor。当我运行此代码时,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的人。

编辑:所以,罗伯的评论使我走上了正确的轨道,但是我遇到了malloc双重释放错误,因为在分配新的drawColor之前,多次调用了添加颜色的方法。有没有办法在我释放drawColor之前检查它是否存在?这是新的相关代码。

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

最佳答案

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

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


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

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

09-06 15:41