3

このモジュールは面倒だと思いました。Photolibrary から 100 枚以上の画像をインポートし、ドキュメント ディレクトリに別の名前で保存しています。予想通り、珍しい場所でメモリの問題が発生しました。UIImagePNGRepresenation がファイルをキャッシュしているようです。そのため、300 以上の画像に対して以下のプロセスを実行すると、「全体のバイト数」が 3.00 GB の範囲で表示され、メモリが原因でクラッシュします (割り当てツールでテスト済み)。以下のコードを貼り付けました。このコードに代わるものはありますか

-(void)something
{
   NSData *data=nil;
   for (int i=0; i<numberOfImages; i++) {
    
    @autoreleasepool {
        
        UIImage *image=[UIImage imageNamed:[NSString stringWithFormat:@"image%d.png",i]];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        
        NSString *documentsDirectory = [[paths objectAtIndex:0] stringByAppendingString:@"directoryname"];
        
        NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"image%d.png",i]];
        
        //convert image into .png format
        data=UIImagePNGRepresentation(image);
        [data writeToURL:[NSURL URLWithString:fullPath] atomically:NO];
      }
   }
   data=nil;
}
4

3 に答える 3

2

この問題は、3 チャンネルの画像 (RGB) の代わりに 4 チャンネルの画像 (RGBA または RGBX) を送信することで解決します。

画像のパラメータを変更する機会があるかどうかを確認できます。

于 2016-12-22T02:09:43.750 に答える
1

この問題を Apple にメールしたところ、割り当てごとにスリープ サイクルを導入するように依頼されました。割り当て前にスリープを追加します。

于 2012-02-02T11:32:04.170 に答える
1

[UIImage imageNamed:]キャッシングはではなくから来ていUIImagePNGRepresentation()ます。代わりにこれを行います:

NSString *imageName = [NSString stringWithFormat:@"image%d.png", i];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

...
于 2012-01-30T10:39:24.957 に答える