ios - CoreImage 的内存泄漏

标签 ios memory-leaks core-image

我创建了如下模糊图像:

//Blur the UIImage
CIImage *imageToBlur = [CIImage imageWithCGImage:viewImage.CGImage];
CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"];
[gaussianBlurFilter setValue:imageToBlur forKey: @"inputImage"];
[gaussianBlurFilter setValue:[NSNumber numberWithFloat: 2] forKey: @"inputRadius"];
CIImage *resultImage = [gaussianBlurFilter valueForKey: @"outputImage"];
CIImage *finalImage = [resultImage imageByCroppingToRect:CGRectMake(0, 10, self.view.bounds.size.width, self.view.bounds.size.height)];

//create UIImage from filtered image
UIImage *blurrredImage = [[UIImage alloc] initWithCIImage:finalImage];

CIFilter *colorMatrixFilter = [CIFilter filterWithName:@"CIColorMatrix"];
[colorMatrixFilter setDefaults];
[colorMatrixFilter setValue:finalImage forKey:kCIInputImageKey];
[colorMatrixFilter setValue:[CIVector vectorWithX:0.25 Y:0 Z:0 W:0] forKey:@"inputRVector"];
[colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0.35 Z:0 W:0] forKey:@"inputGVector"];
[colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:0.4 W:0] forKey:@"inputBVector"];
[colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:1] forKey:@"inputAVector"];

// Get the output image recipe
CIImage *outputImage = [colorMatrixFilter outputImage];

// Create the context and instruct CoreImage to draw the output image recipe into a CGImage
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
blurrredImage = [UIImage imageWithCGImage:cgimg];


CGImageRelease(cgimg);

//Place the UIImage in a UIImageView
UIImageView *newView = [[UIImageView alloc] initWithFrame:self.view.bounds];
newView.image = blurrredImage;

//insert blur UIImageView below transparent view inside the blur image container
[blurContainerView insertSubview:newView belowSubview:transparentView];

我已经释放了 CGImageRef,但仍然在

处发生内存泄漏
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];

我还提到了所有其他相关问题,并实现了提供的答案仍然出现内存泄漏

使用@autoreleasepool { } 并尝试将对象设置为nil

context = nil;
outputImage = nil;
gaussianBlurFilter = nil;
viewImage = nil;

之前

CGImageRelease(cgimg);

仍然显示内存泄漏,描述如下。 ARC开启,ios版本为6.1和7

负责的图书馆是:CoreImage 负责的调用者是:CI::GLESContext::program_for_name(__CFString const*)

有人可以建议我如何解决这个内存泄漏吗?

提前感谢您的帮助。

最佳答案

所有核心框架都使用 C 语言,而不是 Objective-C。您必须手动进行内存管理,并且 ARC 不会在那里帮助您很多,除非将某些(免费桥接)引用的所有权从 Core 转移到 Objective-C 对象。你真的应该阅读 Apple documentation了解您需要做什么。

不过,简而言之,设置对 nil 的引用(在 C 语言中应该是 NULL)会给您带来悬空指针和内存泄漏。

关于ios - CoreImage 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23628783/

相关文章:

ios - 广告标识符 [IDFA] 使用不当(限制广告跟踪)

iOS 通用链接 "NOT"关键字不起作用

ios - CIFilter 不工作

ios - CoreImage CIFeature 用于检测面部情绪

ios - UIToolbar xib xcode

iOS:在 UI(子) View 中处理 UIGestureRecognisers

c++ - Valgrind:是否可以接受越来越多的可能丢失的字节?

objective-c - 非常奇怪的 ARC 内存泄漏

c++ - 堆调试 : Assert failure in dbgdel in MS VC++ 2005

ios - 添加贴纸时来自 CgImageRef 的 UIImage