2011-11-29 25 views
2

我正在尋找一種處理許多圖像的方法,但不會耗盡內存。當我的應用第一次運行時,它必須創建一些縮略圖並將它們存儲在本地。這隻發生一次。Monotouch:操縱許多圖像 - 內存不足

雖然我的內存不足錯誤。

大致我會這樣:

[Loop BigPaths] 
    sourceImg = UIImage.FromFile (nextBigpath); 
    img = UIImageTools.MakeSquare (sourceImg, 50,3); 
    img.AsJPEG().Save (path, NSDataWritingOptions.Atomic, out err); 
    sourceImg.Dispose(); 
    sourceImg = null; 
    img.Dispose(); 
    img = null;  
    [end loop] 

UPDATE

爲了解決這個問題,我現在每10個項目後,調用GC.Collect的(),在一個線程等待50毫秒。睡覺()。

我也做了sourceImgimg外循環定義。

有了這2個變化,我不再會收到內存錯誤。

+1

這不應該發生,因爲你手動處理UIImage。但也許代碼的其他部分不會處理他們的資源?例如圖像處理代碼是否分配?如果我們可以看到有問題的代碼並在循環中運行它來複制'OutOfMemoryException',那將會容易得多。 – poupou

+0

你可以在GetImage中顯示代碼嗎?有一些加載圖像的方法可以讓它們永久保存(UIImage.FromBundle)。 –

+0

我用我的修復程序更新了代碼。我不完全理解它爲什麼有效,但它確實如此。也許每10個圖像使用GC.Collect()並使用Thread.Sleep()有幫助? –

回答

1

這是我找到的解決方案。

創建環路外的圖片變量並重新使用它們,確保每次使用後.Dispose()被調用。

50後的圖像調用GC.Collect(),然後Thread.sleep代碼(50)給予GC的時間來清理。

之後,沒有內存問題。