CGImageRef未在ARC下发布

问题描述 投票:0回答:2

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

我有一个静态方法,使用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;
    }
}
ios objective-c automatic-ref-counting core-image
2个回答
1
投票

看起来像cgimg正在被释放。我认为你的意思是CGImage没有被解除分配。你不会指望它,因为你把它传递给UIImage,它可能会保留它。

很可能你后来泄漏了UIImage(或者当你不指的时候保持它,这类似于泄漏)。我会审核您使用的代码并释放UIImage,而CGImageRef可能会自行处理。


0
投票

试试这个......

+ (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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.