Ios 图像过滤会导致高内存消耗和崩溃

Ios 图像过滤会导致高内存消耗和崩溃,ios,memory,cgimageref,Ios,Memory,Cgimageref,我使用以下代码应用图像过滤器。在我的应用程序中,我过滤亮度、对比度和饱和度。我使用三个单独的滑块分别更改值。当我继续移动这些值时,内存消耗超过1.5 gb并崩溃。有没有办法减少无崩溃实现的内存消耗 (void)setBrightnessAndContrastOf:(UIImage *)image { // forTarget:(UIImageView *)imgView { if (!image) { return; } CIImage *inputI

我使用以下代码应用图像过滤器。在我的应用程序中,我过滤亮度、对比度和饱和度。我使用三个单独的滑块分别更改值。当我继续移动这些值时,内存消耗超过1.5 gb并崩溃。有没有办法减少无崩溃实现的内存消耗

(void)setBrightnessAndContrastOf:(UIImage *)image { // forTarget:(UIImageView *)imgView {

    if (!image) {
        return;
    }

    CIImage *inputImage = [[CIImage alloc] initWithImage:image];
    CIFilter *exposureAdjustmentFilter = [CIFilter filterWithName:@"CIColorControls"];
    [exposureAdjustmentFilter setDefaults];
    [exposureAdjustmentFilter setValue:inputImage forKey:@"inputImage"];

    [exposureAdjustmentFilter setValue:[NSNumber numberWithFloat:self.contrastValue] forKey:@"inputContrast"]; //default = 1.00
    [exposureAdjustmentFilter setValue:[NSNumber numberWithFloat:self.brightnessValue] forKey:@"inputBrightness"]; //default = 0.00
    [exposureAdjustmentFilter setValue:[NSNumber numberWithFloat:self.saturationValue] forKey:@"inputSaturation"]; //default = 1.00
    CIImage *outputImage = [exposureAdjustmentFilter valueForKey:@"outputImage"];

    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef tempImage = [context createCGImage:outputImage fromRect:[outputImage extent]];

    UIImage *newImage = [UIImage imageWithCGImage:tempImage];

    [imageView performSelectorOnMainThread:@selector(setImage:) withObject:newImage waitUntilDone:NO];
    CGImageRelease(tempImage);

    inputImage = nil;
    context = nil;
    outputImage = nil;
    exposureAdjustmentFilter = nil;
}

您不应该在主线程内执行繁重的图像处理。除非您已经实现了多线程(代码段中没有提到),否则请这样做

您可以尝试:

dispatch_queue_t backgroundQueue = dispatch_queue_create("com.yourorg", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(backgroundQueue, ^
                   {
     // setBrightnessAndContrastOf method goes here

        dispatch_sync(mainQueue, ^ {

               //notify main thread about process status
                      });

          });
因为您使用的是ARC,所以不太可能由于内存过度消耗而导致崩溃。然而,如果你阻塞主线程的时间太长,看门狗定时器就会从后门把它拿出来,直接射中它的头部


使用工具监视堆大小,并尝试找出根本原因

我不确定setImage方法正在做什么,但我会将CGImageRelease(tempImage)移动到PerformSelect之前。

在CGImageRelease上设置断点。它是否被调用?@ SpReTraceO328,我使用ARC代码,编译器不自动管理核心基础对象的生命周期。这就是为什么你应该释放它们。附言:你在这么做!现在断点测试…@Spectravideo328我尝试了断点测试,它没有注意到断点。有解决方案吗?我只是将创建的图像分配给一个ImageView。你测试了移动吗?你多久调用一次:SetBrightnessandControlsof?这和视频源有关吗?换句话说,此方法是连续调用还是应请求调用?从服务器加载图像,同时如果我更改滑块i setBrightness and Contrast,则调用此方法。因此,即使您仅从服务器加载一个图像并仅更改滑块一次,您的内存消耗是否会继续增加?