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 個の画像 @ 1 つあたり ~146 KB です。これはおよそ 20 MB ですが、それだけで問題が発生する可能性はないと思います。

GDB は有用な出力なしで終了します。実際には出力はまったくありません。計測器を実行すると、一時停止が発生したときの実際のメモリ使用量はわずか 6.11 MB、CPU は 77.4% ですが、仮想メモリは 175 MB であることがわかります。

私が懸念しているのは、メモリの警告や実際のクラッシュさえなく、スレッドが一時停止するだけで、自動的に再開または強制終了できないことです。xcode 内から強制終了する必要があります。

4

1 に答える 1

5

メモリが多すぎるため、アプリケーションが強制終了されたように見えます。実際、20MB は私が経験した限界であり、これはググって見つけたものにも対応しています。

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

解決策は非常に単純です。いくつかの画像を事前にロードし、カルーセルを移動するときに、さらにいくつかの画像を事前にロードし、古い画像も解放します。実際には、ボールを動かし続けるために、いつでも 5 つ以上の画像をメモリに保持する必要はありません。ほとんど毎回画像をロードする必要がないことに懸念がある場合は、その数を増やすことができます。

于 2011-08-01T16:16:35.607 に答える