2017-05-03 4 views
1

を組み合わせることで、メモリの警告を受信:は、私は次のコードで2 UIImageを結合しようとする2 UIImage

- (void)combineImage:(UIImage *)image WithFrame:(CGRect)frame Completion:(ImageProcessorCompletionBlock)block { 
    __weak typeof(self) wSelf = self; 

    dispatch_async(_queue, ^{ 
     if (wSelf) { 
      typeof(wSelf) sSelf = wSelf; 

      UIGraphicsBeginImageContextWithOptions(sSelf.originalImage.size, NO, 0.0); 

      [sSelf.originalImage drawInRect:CGRectMake(0, 0, sSelf.originalImage.size.width, sSelf.originalImage.size.height)]; 
      [image drawInRect:frame]; 

      UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (block) { 
        block(result); 
       } 
      }); 
     } 
    }); 
} 

私はメモリの使用量をチェックアウトする際に動作しますが、それは私を怖がらせました。メソッドを実行するたびにメモリが立ち上がり、決して解放されません。時々私はメモリの警告を受け取ります。なぜ誰かが私に教えて、問題を解決するための解決策を教えてくれますか?どうもありがとう!

+2

あなたの 'if(block)'チェックは無関係ですが、メソッド本体全体を包含する必要があります。呼び出し元が結果を気にしない場合は、作業を行う上で意味がありません。 – rmaddy

+0

あなたのイメージはサイズが大きいかもしれませんか? – iphonic

+0

画像は大きくなります(エンベロープ計算の後ろには4 x幅x縮尺x高さx縮尺です;たとえば、3倍の縮尺で1000 x 1000を使用すると約36mbかかることがあります)。あなたのメモリが解放されていない場合は、 "デバッグメモリグラフ"機能を使用して、リリースされるべきオブジェクトを特定し、意図しない強い参照が残っているかどうかを確認します。しかし、上記のコードは、再リリースされていないメモリの問題の原因になる可能性は低いです。 – Rob

答えて

0

最後に、問題を見つけました。 UIGraphicsBeginImageContextWithOptions(sSelf.originalImage.size, NO, 0.0);

最初のパラメータは画像のサイズで、最後のパラメータはスケール係数です。最初は、元の画像サイズと同じサイズに設定しています。しかし、スケールを0.0と設定しました。つまり、デバイスのメイン画面の倍率に設定されています。したがって、result画像が拡大されます。

コードを複数回実行すると、resultのサイズが大きくなり、最終的にはメモリを使い切って警告が表示されます。

関連する問題