2013-10-31 50 views
0

我正在使用以下代碼來應用圖像過濾器。在我的應用程序中,我正在過濾亮度,對比度和飽和度。我使用三個單獨的滑塊來更改值。隨着我繼續移動這些值,內存消耗超過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; 
} 
+0

在CGImageRelease上設置一個斷點。它被稱爲? – Spectravideo328

+0

@ Spectravideo328我正在使用ARC代碼 – Nassif

+0

編譯器不會自動管理Core Foundation對象的生命週期。因此,您應該釋放它們。 PS:你正在那樣做!現在斷點測試.... – Spectravideo328

回答

0

你不應該在主線程內進行繁重的圖像處理。除非你已經實現了多線程(這在你的代碼片段中沒有提到),請這樣做。

您可以試試:

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,死機是由於過度的內存消耗是不太可能。但是,如果您阻塞主線太久,看門狗定時器就會通過後門將它從外殼中取出並將其向右拍攝。

使用儀器來監控堆大小並嘗試找出根本原因。

0

我不知道你的setImage方法正在做什麼,但我會在performSelector之前移動CGImageRelease(tempImage)。

+0

我只是將創建的圖像分配給圖像查看 – Nassif

+0

你測試了這個舉動嗎? – Spectravideo328

+0

是的,之前它墜毀在1.53 gb現在它墜毀在1.78 gb – Nassif