【问题标题】:CGImageRef not being released under ARCCGImageRef 未在 ARC 下发布
【发布时间】:2014-10-09 14:23:04
【问题描述】:

我知道之前有人问过这个问题,但似乎没有任何效果。

我有一个使用CIImageCGIImage 返回过滤图像的静态方法,我使用RayWenderlich.com 上的示例并将其更改为返回UIImage,而不是直接将其设置为UIImageView。

我的问题是CGImageRef cgimg 永远不会被释放。这会导致相当快的内存泄漏。我做错了什么?

+ (UIImage *)image:(UIImage *)image withFilterName:(NSString *)filterName
{
    if (!image)
        return nil;


    @autoreleasepool {
        CIImage *beginImage = [[CIImage alloc] initWithCGImage:image.CGImage];

        CIContext *context = [CIContext contextWithOptions:nil];

        CIFilter *filter = [CIFilter filterWithName:@"CIPhotoEffectProcess"]
        [filter setValue:beginImage forKey:kCIInputImageKey];

        CIImage *outputImage = [filter outputImage];

        CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];

        UIImage *newImage = [UIImage imageWithCGImage:cgimg];

        CGImageRelease(cgimg);

        return newImage;
    }
}

【问题讨论】:

  • 我只是在这里猜测,但因为 CGImageRef 不是 NSObject 的子类(因此没有 retainrelease 选择器),我很确定 ARC 没有算了。
  • 我没有发现您发布的代码有任何问题。你用newImage做什么?

标签: ios objective-c automatic-ref-counting core-image


【解决方案1】:

看起来cgimg 正在被释放。我假设您的意思是 CGImage 没有被释放。你不会期望它是,因为你将它传递给UIImage,它可能会保留它。

您很可能稍后会泄漏UIImage(或者在您不打算这样做时将其保留,这类似于泄漏)。我会在你使用和发布UIImage 的地方审核代码,CGImageRef 可能会自行处理。

【讨论】:

    【解决方案2】:

    试试这个方法....

    + (UIImage *)image:(UIImage *)image withFilterName:(NSString *)filterName
        {
            if (!image)
                return nil;
    
            CIImage *beginImage = [[CIImage alloc] initWithCGImage:image.CGImage];
            CIContext *context = [CIContext contextWithOptions:nil];
            CIFilter *filter = [CIFilter filterWithName:@"CIPhotoEffectProcess"];
            [filter setValue:beginImage forKey:kCIInputImageKey];
            CIImage *outputImage = [filter outputImage];
            CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
            UIImage *newImage = [UIImage imageWithCGImage:cgimg];
    
            beginImage = nil;
            context = nil;
            filter = nil;
            outputImage = nil;
            CGImageRelease(cgimg);
    
            return newImage;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多