Dispatch Queue中的CIFilters导致启用ARC的项目中出现内存问题

时间:2014-02-11 01:25:02

标签: ios objective-c memory-management automatic-ref-counting grand-central-dispatch

我正在运行一些CIF过滤器来模糊图形并且它非常迟钝所以我将代码包装在

dispatch_async(dispatch_get_main_queue(), ^{ /*...*/ });

一切都加快了,摇摇晃晃!非常快速的处理,无缝模糊,非常棒!

大约一分钟后应用程序崩溃了250Mb内存(当我不使用调度时,我只使用大约50Mb内存,因为ARC管理所有内存)

我在整个项目中都使用了ARC,所以我尝试通过在调度线程中释放CIFilter来手动管理内存,但是xCode不断返回错误,因为我使用ARC,所以不会让我手动释放。在这一点上,关闭ARC并遍历每个.m文件并手动管理内存将是一个疯狂的麻烦。

那么我如何专门管理我的CIFilters的调度内存?

我尝试将它全部包裹在@autoreleasepool { /*...*/ }中(ARC奇怪地允许哪些?)但它没有用。 /:


调度线程内的示例代码:

        UIImage *theImage5 = imageViewImDealingWith.image;

        CIContext *context5 = [CIContext contextWithOptions:nil];
        CIImage *inputImage5 = [CIImage imageWithCGImage:theImage5.CGImage];

        // setting up Gaussian Blur (we could use one of many filters offered by Core Image)
        CIFilter *filter5 = [CIFilter filterWithName:@"CIGaussianBlur"];
        [filter5 setValue:inputImage5 forKey:kCIInputImageKey];
        [filter5 setValue:[NSNumber numberWithFloat:5.00f] forKey:@"inputRadius"];
        CIImage *result = [filter5 valueForKey:kCIOutputImageKey];

        // CIGaussianBlur has a tendency to shrink the image a little,
        // this ensures it matches up exactly to the bounds of our original image
        CGImageRef cgImage = [context5 createCGImage:result fromRect:[inputImage5 extent]];


        imageViewImDealingWith.image = [UIImage imageWithCGImage:cgImage];

        CGImageRelease(cgImage);
        context5 = nil;
        inputImage5 = nil;
        filter5 = nil;
        result = nil;

1 个答案:

答案 0 :(得分:0)

你发布了cgImage吗?

CGImageRelease(cgImage);