内存泄漏,但是CGContextRelease破坏了视图

时间:2018-09-25 23:45:47

标签: ios memory drawrect

我遇到内存问题:

使用自定义Background.m类,我基于传递给该类的颜色选择来创建渐变背景。出现问题的地方似乎是泄漏,没有什么令人兴奋的东西,而是随着时间的推移而积累。在drawRect中释放上下文可消除内存问题,但是不会绘制渐变。最好的解决方案/解决方法是什么?使用Apple的渐变色?这是传递给Background类的drawRect方法的代码:

    //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 :(得分:1)

每个<div id="videoContainer"></div>CreateCopy必须由Retain进行平衡。您在这里违反了两次。

首先,您没有Release的{​​{1}}余额。

第二,您要释放不属于您的东西(Release)。

相关,每个CFArrayCreateMutable必须由一个ref进行平衡,因此您正在泄漏malloc

您的清理代码应为

free