2011-11-29 12 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:それを修正するには

を、私は今のスレッドで50ミリ秒を待って、すべての10の項目の後にGC.Collect()を呼び出しています。睡眠()。

また、私はsourceImgimgをループ外で定義しました。

これらの2つの変更で、私はもはやメモリエラーを取得していません。

+1

これは、UIImageを手作業で処理した後には起こらないはずです。しかし、コードの他の部分がリソースを処分していない可能性があります。例えばイメージ操作コードは?あなたが問題のコードを見て、それをループで実行して 'OutOfMemoryException'を複製することができれば、あなたを助けるほうがはるかに簡単です。 – poupou

+0

GetImageにコードを表示できますか?それらをすべて永続的にキャッシュし続ける画像をロードする方法はいくつかあります(UIImage.FromBundle)。 –

+0

私の修正プログラムでコードを更新しました。私はそれがなぜ機能するのか完全に理解していませんが、それはありません。 GC.Collect()を10枚ごとに使用し、Thread.Sleep()を使用すると便利でしょうか? –

答えて

1

これは私が解決した解決策です。

ループの外側にイメージ変数を作成して再利用し、各使用後に必ず.Dispose()を呼び出します。

50個のイメージがGC.Collect()を呼び出した後、Thread.Sleep(50)を呼び出してGC時間をクリーンアップした後。

その後、メモリに問題はありませんでした。

関連する問題