我有一个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);
答案 0 :(得分:4)
非常确定你只需要CGColorRelease(drawColor)
来防止泄漏。了解这有助于您的表现。
答案 1 :(得分:0)
如果您正在泄漏CGColor
个对象,解决问题的第一步是停止泄漏它们。完成颜色对象后,需要调用CGColorRelease
。例如,您显然是在示例代码中泄露了drawColor
对象。你应该这样做:
CGColorRelease(drawColor);
drawColor=CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);
在将新对象分配给drawColor
之前释放drawColor
引用的旧对象。
CGColor
个对象是不可变的,因此您将无法修改现有对象。