2

画面に多数の画像を表示するために UIImages の配列を使用しようとしています。現在、各画像を NSMutableArray に追加し、必要に応じてアクセスしていますが、画像の数が増えると、最終的にアプリがクラッシュします。

Instruments を使用してメモリ割り当てを調べてみましたが、メモリが約 20MB に達するとアプリがクラッシュするようです。これを回避する方法はありますか?または、これを行っているときにメモリをできるだけ節約する方法はありますか? これに対する答えがなくても、同じような問題を経験した人はいますか? もしそうなら、どのように妥協/解決しましたか?

ちなみに、ファイル(またはコアデータ)への保存と取得のオプションは考えていませんでした.アプリは画像をすばやく使用する必要があるためです.iOSでのコアデータまたはファイルの書き込み/読み取りは難しいという印象がありました.メモリ使用時と比べて遅い(間違っていたら訂正してください)

4

2 に答える 2

3

はい、可変配列に多くの画像を保存すると、使用可能なメモリが大量に消費されます。また、コアデータについて考えることができます。ただし、実行時にコアデータからデータを保存および取得すると、いくつかの遅い機能が発生しますが、メモリの使用に対しては安全です。
このようなシナリオでは、次の機能を常にお勧めします。すべての画像をドキュメント ディレクトリにキャッシュし、その URL (ファイルの場所) パスをコアデータ (または他のデータベース) に保持します。プレゼンテーションの時間に、ストレージの現在の画像、前の画像、次の画像から 3 つの画像を撮りました。現在の画像を表示するたびに、ユーザーはスクロールでき、次または前の画像をスムーズに見ることができます。ユーザーが次の画像に移動すると、それらの 3 つの画像が変更されます。現在の画像が前の画像になり、次の画像が現在の画像になり、ストレージの場所から次の画像になる新しい画像をロードします。ループ内のすべての画像を取得し、3 つの画像のみを使用してこのループを処理します。

于 2013-04-17T05:06:33.497 に答える
1

私も同じ問題を抱えていました。さまざまなことを試し、最終的に NSData オブジェクトの配列を格納し、その場で UIImage に変換することに成功しました。

for (NSString *imageFile in directoryList) {
    NSString *fileLocation = [imageFolder stringByAppendingPathComponent:imageFile];
    NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];
    if (imageData) {
        [images addObject:imageData];
    } else {
        [Util trace:@"cannot get image data for image named: %@", fileLocation];
    }

次に、イメージを更新します。

 -(void)updateImageView:(id)sender
{       
    UIImage *anImage = [UIImage imageWithData:[images safeObjectAtIndex:nextImage] ];
    [imageView setImage:anImage];
    nextImage++;
}
于 2013-05-09T21:43:04.620 に答える