4

私のアプリには3つのビューがありますUIImageViews。リソースファイルとして約150の画像があり、それぞれの.jpgは約24kです。アプリはすべての画像を表示しますが、一度に3つだけ表示されます。

しかし、ボタンをクリックしてさらに3つの画像をにロードするたびにUIImageViews、Instrumentsの[Overall Bytes]列が約700K増加し、最終的にメモリ不足の警告が表示されてアプリがクラッシュします。どういうわけか、3つの画像のロードごとに使用するメモリが解放されていません。

私はグーグルでこれを行うために知っているあらゆる方法を試しましたが、成功せず、助けが必要です。

私はこれを試しました:(このコードは、さらに3つの画像をロードするアクションの一部です。3つのImageViewは、、、ですimgShownLeftimgShownMiddleこれらimgShownRightはインスタンス変数です。最初にcurrentImage3つすべてを入力しUIImageViews、次にpreviousImage左側の画像を入力する必要があります。nextImage正しいもの:

NSString *strImageToSet = [[imgNamesArray objectAtIndex:currentImage] stringByAppendingFormat:@".jpg"];
UIImage *img = [UIImage imageNamed:strImageToSet];
[imgShownMiddle setImage:img];
[imgShownLeft setImage:img];
[imgShownRight setImage:img];

NSString *strPreviousImage = [[imgNamesArray objectAtIndex:previousImage] stringByAppendingFormat:@".jpg"];
img = [UIImage imageNamed:strPreviousImage];
[imgShownLeft setImage:img];

NSString *strNextImage = [[imgNamesArray objectAtIndex:nextImage] stringByAppendingFormat:@".jpg"];
img = [UIImage imageNamed:strNextImage];
[imgShownRight setImage:img];

それから私はこれを試しました:代わりに:

    UIImage *img = [UIImage imageNamed:strImageToSet];

私が使用した:

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:strImageToSet];

同じ方法で 割り当てられimg、その後にUIImageViews[img release];

それから私は試しました:

    UIImage *img = [[[UIImage alloc] initWithContentsOfFile:strImageToSet] autorelease];

それから私は試しました:

    img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]];

ただし、いずれの場合も、このアクションを実行するたびにメモリ要件が増加しました。

150枚の画像をメモリに保持しなくても、一度に3枚の画像をロードしておくことができることを私は知っています!私は何が間違っているのですか?

洞察をありがとう。/SD

4

1 に答える 1

-1

あなたが欲しいのは使うことだと思います

img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]];

ロードを実行し(UIImage imageNamed:おそらく、不要なキャッシュを実行するため)、追加します

[img release];

setImage呼び出しの後、サブビューはretain画像を取得する必要があるため、参照カウントがリークしています。

2番目のバージョンは適切に機能すると思っていたautoreleaseでしょうが、正直なところ、Cocoaのメモリ管理ルールは、自分が何をしているのかをかなり確信している場合でも、混乱を招きます。

于 2009-07-11T12:43:17.807 に答える