2

イメージをカルーセルに読み込むアプリケーションをiPadで実行しています。合計で138の画像があります。その数を100に減らすと、アプリケーションは正常に読み込まれます。しかしながら、138において、アプリケーションはクラッシュするのではなく、一時停止する。メモリに問題がありますか?

ブレークポイントに示されているように、viewDidLoadステートメントと最初のforステートメントに達しています。問題は2番目のforステートメントにあります。

// loading images into the queue 

loadImagesOperationQueue = [[NSOperationQueue alloc] init]; 
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithCapacity:14]; 

for (int i = 0; i < 137; i++) { 
    [tmpArray addObject:[NSString stringWithFormat:@"cover_%d.jpg", i]]; 
} 

for (int i = 0; i < 137; i++) { 
    int index = arc4random() % [tmpArray count]; 
    NSString *imageName = [tmpArray objectAtIndex:index]; 
    [tmpArray removeObjectAtIndex:index]; 
    [(AFOpenFlowView *)self.view setImage:[UIImage imageNamed:imageName] forIndex:i]; 
} 

私はARCでのiOS 5を使用していますので、私は手動メモリ管理をやってする必要はありませんが、私は、メモリの問題があることが推測しています。

あまりにもがメモリに保持されている可能性はありますか?それは138〜@ 146 KBです。それは約20 MBですが、私だけではこの問題が発生する可能性はありません。

GDBは役に立たない出力をせずに終了します。実際には出力はまったくありません。実行中の機器では、一時停止が発生すると、実際のメモリ使用量は6.11 MB、CPU使用率77.4%、仮想メモリ使用量175 MBとなっています。

私が心配しているのは、メモリーの警告も実際のクラッシュもなく、スレッドが一時停止して自動的に再開または強制終了できないということです.xcodeからそのスレッドを強制終了する必要があります。

答えて

5

あまりにも多くのメモリを必要とするため、アプリケーションが殺されるように見えます。確かに、20MBが私が経験した限界であり、これはあなたがそれをグーグルで見つけられることにも対応しています。

メモリの警告が表示されないという事実については、メインループに制御を戻さないタイトなループでイメージをメモリにロードしているために発生します。したがって、メッセージdidReceiveMemoryWarningを受け取る機会はありません。

解決策はかなりシンプルで、いくつかの画像をあらかじめロードして、カルーセルを移動するときに、より古い画像をプリロードし、古い画像をプリロードします。実際にボールを走らせ続けるためには、いつでも5枚以上の画像をメモリに保存する必要はありません。ほとんど毎回画像をロードする必要がないことを心配している場合は、その数を増やすことができます。

+0

また、これら138個のイメージは、ディスク上の圧縮ファイルの〜146 KBサイズよりも、メモリ内の非圧縮ビットマップとして多くのメモリを占有している可能性があります。 –

関連する問題