Как освободить память при следующей ситуации? - PullRequest
1 голос
/ 13 июля 2011

Ниже приведен основной графический код ..

        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 ]

3 голосов
/ 13 июля 2011

Нет, потому что тогда 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;
}
2 голосов
/ 13 июля 2011

Нет, это не так. Вы немедленно выпускаете цвет, который создали. Правильный подход был бы такой:

 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]);
 }
...