如何在以下情况下释放内存?

时间:2011-07-13 15:04:41

标签: macos memory-leaks core-graphics

下面是一些核心图形代码..

        CGColorRef colorRefArray[MAGIC_NUM];

        for (int i = 0; i < MAGIC_NUM ; i++)
        {
           ...

           colorRefArray[i] = CreateColor(colorValueForEachColor, numberofcomp);                
        }

colorRefArray已经有了内存和CreateColor();将再次创建一个内存,它会导致内存泄漏。

我该如何避免这种情况?

我有一个可能的想法是

            CGColorRef colorRefArray[MAGIC_NUM];

            for (int i = 0; i < MAGIC_NUM ; i++)
            {
               ...
               CGColorRef colorref = CreateColor(colorValueForEachColor, numberofcomp);
               colorRefArray[i] = colorref;
               CFRelease(colorref);

            }

这种做法是否正确?

2 个答案:

答案 0 :(得分:3)

不,因为colorRefArray将填充无效指针。

尝试使用CFMutableArray而不是原始C数组。然后你只需要担心对数组的引用,因为它将拥有你的颜色:

CFArrayRef CopyColorArray(void) {
    CFMutableArrayRef colorRefArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
    if (colorRefArray) {
        for (int i = 0; i < MAGIC_NUM ; i++) {
            ...
            CGColorRef colorref = CreateColor(colorValueForEachColor, numberofcomp);
            if (colorref) {
                CFArrayAppendValue(colorRefArray, colorref);
                CFRelease(colorref);
            }
        }
    }

    return colorRefArray;
}

答案 1 :(得分:2)

不,不是。您将立即释放您创建的颜色。正确的方法是:

 CGColorRef colorRefArray[MAGIC_NUM];
 for (int i = 0; i < MAGIC_NUM ; i++)
 {
     ...
    colorRefArray[i] = CreateColor(colorValueForEachColor, numberofcomp);                
 }
 //Use your colors
 //Now release them
 for (int i = 0; i < MAGIC_NUM ; i++)
 {
    CFRelease(colorRefArray[i]);
 }