【问题标题】:Efficiently Modifying CGColor高效修改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);

【问题讨论】:

    标签: iphone performance objective-c++ cgcolor


    【解决方案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 的地方。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 2013-06-19
    • 2017-03-13
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多