首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >内存泄漏,但CGContextRelease会破坏视图

内存泄漏,但CGContextRelease会破坏视图
EN

Stack Overflow用户
提问于 2018-09-26 07:45:47
回答 1查看 35关注 0票数 0

我正面临着一个记忆问题:

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

代码语言:javascript
复制
    //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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-26 08:05:22

每个CreateCopyRetain都必须由Release来平衡。你在这里两次违反了这一点。

首先,您没有针对CFArrayCreateMutable的平衡Release

第二,你发布了一些你不拥有的东西(ref)。

与此相关的是,每个malloc都必须由一个free来平衡,因此您正在泄漏locations

你的清理代码应该是

代码语言:javascript
复制
free(locations);
CGRelease(mref);
CGColorSpaceRelease(spaceRef);
CGGradientRelease(gradientRef);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52508020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档