2016-08-10 21 views
0

最近私はPHAssetsを使用してプロジェクト内の古いアセットを置き換えました。しかし、私のアプリを使って画像を拡大すると、通常クラッシュしていました。 私は、デバッグモードを使用して、メモリの問題であることがわかりました。 は、私はコードがdrawInRectを使用して画像のサイズを変更するメモリ

[img drawInRect:CGRectMake(0,0, sb.width, sb.height)] 

実行し、それが自由にsettedされることはありませんが、でも、メソッドが終了すると思ったときに、メモリが50M程度増加します絵

+(UIImage*)scaleRetangleToFitLen:(UIImage *)img sWidth:(float)wid sHeight:(float)hei{ 
    CGSize sb = img.size;; 
    if (img.size.height/img.size.width > hei/wid) { 
     sb = CGSizeMake(wid,wid*img.size.height/img.size.width); 
    }else{ 
     sb = CGSizeMake(img.size.width*hei/img.size.height,hei); 
    } 
    if (sb.width > img.size.width || sb.height > img.size.height) { 
     sb = img.size; 
    } 
    UIImage* scaledImage = nil; 
    UIGraphicsBeginImageContext(sb); 
    [img drawInRect:CGRectMake(0,0, sb.width, sb.height)]; 
    scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    img = nil; 
    return scaledImage; 
} 

のサイズを変更するには、以下のコードを使用します。 幅と高さは304 * 228、画像の元のサイズは約3264 * 2448、返される画像は304 * 228です。つまり、私が最後に望んでいた実際の画像は単なる304 * 228サイズの画像ですが、 50 + M memory .. drawInRect:関数のメモリを解放する方法はありますか? (@autoreleasepoolは動作しません)

答えて

0

イメージをロードするとき、通常、iOSは実際に必要となるまで、イメージを展開しません。したがって、あなたがあなたの関数に渡すイメージは、iOSが圧縮された状態でメモリに保存されているJPEGまたはPNGイメージの可能性が高いです。あなたがそれを描いた瞬間、最初に圧縮解除されるので、メモリが大幅に増加します。 3264 x 2448 x 4 = 35MB(50MBではなく)の増加が予想されます。

メモリをもう一度取り除くには、関数に渡すイメージへの参照をすべて解放するようにします。問題はあなたの質問に表示されるコードの外です。

より具体的な回答をするには、元の画像で機能するすべてのコードを表示する必要があります。

+0

あなたのお答えいただきありがとうございます。コードは次のようなものです:(私は以下のコメントに私のコードを追加しています) – AFu

+0

上のコードは私の答えです。今は "UIImage * ti = pv.image.image copy]; " "UIImage * ti = pv.image.image;"の代わりに、それは動作しません。それはコピーオブジェクトと元のオブジェクトが同じ画像にリンクされているようですが、画像を描画するとメモリが増えますが、元のオブジェクトはフリーに設定されていないため、メモリは解放されません。この種の状況(UIImageViewオブジェクトには35Mバージョンは必要ありませんが、描画メソッドを使用して35Mにします。描画後、35Mバージョンを小さなものに設定するにはどうすればいいですか) – AFu

+0

3264 * 2448サイズのイメージ、私は最初に小さいバージョンを使用する必要がありますので、描画があまり増加しないように~~ – AFu

関連する問題