2

iOS 6.1 では、scrollView を備えたビュー コントローラーがあり、ユーザーがページをフリックするときにいくつかの画像を表示する必要があります。scrollView には、現在、前、次の画像をそれぞれ表示する 3 つのサブビューがあります。スクロール中に画像が入れ替わります。メカニズムは正常に動作しますが、リソースが期待どおりに解放されず、約 15 枚の画像をスクロールした後にアプリが終了します。

最初は、新しい画像をUIImageViewに割り当てるだけで問題を解決しようとしましたが、うまくいかなかったので(画像がキャッシュされていることを読みました)、別のアプローチを試しました:

// access the UIImageView of the currentView
for (UIView *subviewOfCurrentView in [currentView subviews]) {
    if ([subviewOfCurrentView isKindOfClass:[UIImageView class]]) {
        UIImageView *cv = (UIImageView *)subviewOfCurrentView;
        //cv.image = nil;
        [cv removeFromSuperview];
        UIImageView *new_cv = [[UIImageView alloc] initWithFrame:photoRect];
        new_cv.image = [UIImage imageNamed:[myObject getFileName];
        [currentView addSubview:new_cv];

    }
}

アクティビティ モニターを使用してアプリをプロファイリングすると、サブビューの数が一定のままであるにもかかわらず、画像をフリックすると実際のメモリ使用量が増加し続けることがわかります。

アプリは didReceiveMemoryWarning を呼び出さずに終了することに注意してください。

UIImage(s) と UIImageView(s) で使用されているメモリをアプリに解放させるにはどうすればよいですか?

あなたが私を助けることができれば、とても感謝しています。

4

1 に答える 1

5

UIImageによってロードされたimageNamed:ものは自動的に解放されません (それらはキャッシュされ、同じ名前の画像は同じデータを共有します)。

画像を自動的に解放する場合は、imageWithContentsOfFile:またはを使用します。imageWithData:scale:からのメソッドを使用してイメージ パスを取得できることに注意してくださいNSBundle。ただし、少し複雑になります。

次の部分を自分で実装する必要があります

画面のスケールが 2.0 の場合、このメソッドは最初に、@2x サフィックスが付加された同じファイル名の画像ファイルを検索します。たとえば、ファイルの名前が button の場合、最初に button@2x を検索します。2x が見つかった場合は、その画像を読み込み、返された UIImage オブジェクトの scale プロパティを 2.0 に設定します。それ以外の場合は、変更されていないファイル名を読み込み、scale プロパティを 1.0 に設定します。

新しい iOS 7 イメージ ストアを使用する場合、イメージのパスを取得する方法がわかりません。

于 2013-09-19T11:49:10.560 に答える