2016-04-25 14 views
2

画像を表示して一定のサイズに拡大するアプリがあります。ここ は、スケーリングのためのコードです:SWIFTを使用したiOSでの画像のスケーリングに関するメモリリーク

for i in 0 ..< images.count{ 
    if let data = images[i].imageData, let originalImage = UIImage(data: data) { 
     previewImage = scaledImage(originalImage: originalImage, scaledToSize: desiredSize)    
    } 
} 

私は見つけるために楽器を使用するとアプリが50枚の画像 のためにクラッシュしていました:

static func scaledImage(originalImage image: UIImage, scaledToSize size: CGSize) -> UIImage {   
    UIGraphicsBeginImageContextWithOptions(size, true, 0.0) 
    image.drawInRect(CGRectMake(0, 0, size.width, size.height)) 
    let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return scaledImage 
} 

、ここでは、関数の呼び出しが行われている方法ですメモリが割り当てられたところで、この行は960 MBを割り当てていることを教えてくれました。 image.drawInRect(CGRectMake(0、0、size.width、size.height))

これはかなりのメモリです。

私の質問はここで間違っていますか? そのメモリリークを解決する方法。

イメージを拡大縮小する方法について多くの例を検索しましたが、ほぼ同じでした。メモリ管理の例はなく、画像処理の経験があまりないため、この問題にどう対処するか分かりません。

ここにお手伝いいただければ幸いです。 ありがとうございます

+6

これは必ずしもリークではありません。イメージはかなりのメモリを占有します。同時に50個のメモリと50個のリサイズされたメモリを同時にメモリに保持している場合は、おそらく時間がかかりそうです。メモリ内のイメージのメモリサイズは、通常、幅*高さ* 4バイトです。元の画像とそのサイズ変更されたバージョンはどれくらいのサイズでしたか?それぞれのサイズに対して上記の50倍を掛けます。 –

+0

返事をありがとう。元の画像はフルHDです。ソリューションを最適化してよりうまく動作する方法はありますか?また、グラフィックスコンテキストによって割り当てられたメモリを解放する方法は? – tester777

+0

1080pフレームのサイズはそれぞれ8.3 MBです。それらのうち50個が415 MBのメモリを占有します(これは50 MBの割り当てでも、古いiOSデバイスでアプリケーションが終了します)。一度に50枚の画像をすべてメモリにロードしないでください。必要に応じて各画像をロードしてサイズを変更し、最大で2枚の画像のキャッシュを維持します。画像が完成したら、その画像への参照を保持していないことを確認してください。 –

答えて

3

あなたはscaledImageの呼び出しを自動解除する必要があります。

autoreleasepool { 
    previewImage = scaledImage(originalImage: originalImage, scaledToSize: desiredSize) 
} 
+0

autoreleasepoolは私のためには機能しませんでした。私は – RowanPD

+1

と呼ぶたびに40MBほどしか失うことはありません。アップデート:オートレリープールは、ループ全体をラップすると機能します。私は、ループの内部を拡大してメモリが足りなくなるたびに、40MBほど失っただけです。 – RowanPD

関連する問題