Утечка памяти, но CGContextRelease разрушает представление - PullRequest
0 голосов
/ 26 сентября 2018

У меня проблема с памятью:

Используя пользовательский класс Background.m, я создаю градиентные фоны на основе выбора цветов, передаваемых в класс.Проблема возникает в том, что, похоже, есть утечка, ничего интересного, но она накапливается со временем.Освобождение контекста в drawRect устраняет проблему с памятью, но тогда градиент не рисуется.Какое лучшее решение / обходной путь?Использовать градиенты Apple?Вот код, переданный методу drawRect класса Background:

    //1. create vars
    float increment = 1.0f / (colours.count-1);
    CGFloat * locations = (CGFloat *)malloc((int)colours.count*sizeof(CGFloat));
    CFMutableArrayRef mref = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);

    //2. go through the colours, creating cgColors and locations
    for (int n = 0; n < colours.count; n++){
        CFArrayAppendValue(mref, (id)[colours[n] CGColor]);
        locations[n]=(n*increment);
    }

    //3. create gradient
    CGContextRef ref = UIGraphicsGetCurrentContext();
    CGColorSpaceRef spaceRef = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradientRef = CGGradientCreateWithColors(spaceRef, mref, locations);

    if (isHorizontal){
        CGContextDrawLinearGradient(ref, gradientRef, CGPointMake(0.0, 0.0), CGPointMake(self.frame.size.width, 0.0), kCGGradientDrawsAfterEndLocation);
    } else if (isDiagonal) {
        CGContextDrawLinearGradient(ref, gradientRef, CGPointMake(0.0, 0.0), CGPointMake(self.frame.size.width, self.frame.size.height), kCGGradientDrawsAfterEndLocation);
    } else {
        CGContextDrawLinearGradient(ref, gradientRef, CGPointMake(0.0, 0.0), CGPointMake(0.0, self.frame.size.height), kCGGradientDrawsAfterEndLocation);
    }

    CGContextRelease(ref); //ISSUE
    CGColorSpaceRelease(spaceRef);
    CGGradientRelease(gradientRef);

1 Ответ

0 голосов
/ 26 сентября 2018

Каждые Create, Copy и Retain должны быть сбалансированы на Release.Вы дважды нарушаете это.

Во-первых, у вас нет баланса Release для CFArrayCreateMutable.

Во-вторых, вы выпускаете то, что вам не принадлежит (ref).

Связано, каждый malloc должен быть уравновешен free, поэтому у вас есть утечка locations.

Ваш код очистки должен быть

free(locations);
CGRelease(mref);
CGColorSpaceRelease(spaceRef);
CGGradientRelease(gradientRef);
...