2016-12-26 73 views
-1

我有問題,我嘗試使用過濾器的一些圖像有擴展名3000x2000,當我做它RAM上層和應用程序有「didReceiveMemoryWarning」致命錯誤。核心圖像和內存泄漏,迅速3.0

func setFilters(images: [UIImage]) -> [UIImage] { 
    let filter = CIFilter(name: "CIColorControls")! 
    filter.setValue(2.0, forKey: kCIInputContrastKey) 

    let context = CIContext(options: nil) 

    var result = [UIImage]() 

    for img in images { 
     let newImage = autoreleasepool(invoking: {() -> UIImage in 
      filter.setValue(CIImage(image: img)!, forKey: kCIInputImageKey) 

      let ciImage = filter.outputImage! 
      let cgImage = context.createCGImage(ciImage, from: ciImage.extent) 


      return UIImage(cgImage: cgImage!, scale: img.scale, orientation: img.imageOrientation) 
     }) 

     result.append(newImage) 
    } 

    return result 
} 

回答

1

這不是一個內存泄漏;這實際上是在使用太多的內存。這不是使用CIFilter導致的問題;這是事實上,你試圖保持所有這些巨大的UIImage對象在內存中的單一陣列:

var result = [UIImage]() 
// ... 
result.append(newImage) 

不這樣做。

+0

然後如何在過濾器後存儲圖像,我做了10張照片,並嘗試過濾它們並保存到手機。 –

+0

你可以保存它們,但你需要保存每一個_immediately_,不要等到你過濾了其中的10個。你沒有那個記憶。同樣,您不能拍攝10張照片並將其全部保留在記憶中。最初將每一個保存到磁盤。只加載_one_照片進行處理,處理它,保存處理的照片並釋放這兩張照片。重複。簡單。 – matt

+0

如果我將註釋與「result.append(newImage)」一致,該程序將崩潰didReceiveMemoryWarning的bcs。 –