即使发布了CIImageRefs,CIContext Memory也会泄漏

时间:2014-04-18 18:28:31

标签: ios objective-c xcode memory-leaks

我正在使用找到here的解决方案来模糊使用CIGaussianBlur的图像。但是,我得到了一个无法解决的内存泄漏问题。我最初使用的不使用CIContext作为属性,但认为这可能是无济于事的问题。我也从输出图像中使用了一个CGRect,但是更改了它以尝试关闭泄漏,再一次无效。

我相信我正在释放我需要的所有东西(ARC正在开启),那么可能导致内存泄漏的原因是什么?

    CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"];
    CGImageRef cgimage = [image CGImage];
    [gaussianBlurFilter setValue:[CIImage imageWithCGImage:cgimage] forKey:kCIInputImageKey];
    [gaussianBlurFilter setValue:@10 forKey:kCIInputRadiusKey];
    CIImage *outputImage = [gaussianBlurFilter outputImage];
    if (imageContext == nil) {
        imageContext = [CIContext contextWithOptions:nil];
    }
    CGImageRef cgimg     = [imageContext createCGImage:outputImage fromRect:CGRectMake(0.0, 0.0, 25.0, 25.0)];
    UIImage *blurredImage       = [UIImage imageWithCGImage:cgimg];

    pictureIncognito.image = blurredImage;
    pictureIncognito.layer.cornerRadius = pictureIncognito.frame.size.width / 2.0;
    pictureIncognito.layer.masksToBounds = YES;
    pictureIncognito.layer.borderWidth = 1.0;
    pictureIncognito.layer.borderColor = [[UIColor whiteColor] CGColor];

    CGImageRelease(cgimage);
    CGImageRelease(cgimg);

enter image description here

1 个答案:

答案 0 :(得分:2)

编辑:

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextRelease

我今天遇到过这个。事实上,您需要使用此特殊功能释放上下文。


我的回答来自this question.

作为观察,我认为你不需要这一行:

CGImageRelease(cgimage);

您实际上并不拥有该对象(您用来设置该对象的方法没有' get',' alloc',' create& #39;,或者' new' in。)

我没有很多CGImage的经验,但我认为上下文仍然存在于Objective-C运行时的某个地方,并且上下文以某种方式保留了图像本身。因此,将上下文(以及其他所有内容)设置为nil可能会解决问题。

当然,如果这样可行,则意味着您将为您模糊的每个图像创建新的上下文,这可能会影响您稍后修改图像的能力......但它可能会解决内存泄漏问题!< / p>