使用Core Image滤镜时,CFData内存使用量不断增加

4
我遇到了分配内存过多的问题。我的应用程序分配内存高达100MB!是的,我正在使用ARC。大部分分配的内存来自CFData(据我所知,这是CoreImage滤镜)。在对图像应用滤镜后,CFData分配的内存增加了约1.3mb,并且不会被释放。

Instruments showing the memory usage

代码如下:
+(UIImage*)BWFilter:(UIImage *)imgFX
{
    CIImage *sourceImage = [[CIImage alloc] initWithImage:imgFX];

    CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, sourceImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage;
    CIImage *output = [CIFilter filterWithName:@"CIExposureAdjust" keysAndValues:kCIInputImageKey, blackAndWhite, @"inputEV", [NSNumber numberWithFloat:0.7], nil].outputImage;

    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent];
    imgFX = [UIImage imageWithCGImage:cgiimage];

    if (cgiimage) {
        CGImageRelease(cgiimage);
    }

    return imgFX;
}

在收到内存警告后,内存使用量并不会下降,所以这不是缓存问题。


你是如何存储返回的图像的? - Brett
1
换句话说,调用代码是什么样的?问题中的代码示例看起来不错。此外,泄漏检测工具显示了什么? - zoul
你运行了静态分析器吗?产品 > 分析。它给出了任何诊断吗? - rob mayoff
静态分析器没有给我任何东西。泄漏检测工具也没有显示任何泄漏。http://pastebin.com/wDJhzu4G 我调用ReDraw方法来重新绘制存储在列表中的所有过滤器。 - Hariz Hent
据我所知,CGImageRelease(cgimg)不起作用。第一次应用过滤器后,因为它没有释放由cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; 创建的图像。 - Hariz Hent
1个回答

0

我在一个带有ARC的示例项目上运行了您的代码,它没有泄漏也没有额外的分配。 CFData 不是必须与 CIFilter 子类相关联,而是与 CIImage 相关。问题出在其他地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接