2

アプリケーション内の最初のビューは、一度だけ表示する必要があります。

カスタム セグエ内で次を使用して、ナビゲーション コントローラー スタックからそれを取得し、新しいものに移行します。

- (void)perform {
    UINavigationController *nav = [self.sourceViewController navigationController];
    NSArray *viewControllers = [NSArray arrayWithObject:self.destinationViewController];
    [nav setViewControllers:viewControllers animated:YES];
}

メソッドが呼び出されることは確認できましたがdealloc、メモリ使用量は減りません。かなり大きな画像(UIImageView)が含まれており、他のView Controllerは(メモリに関して)小さいため、メモリがViewControllerによって割り当てられ、解放されると予想されることは100%確信しています。

また、含まれている要素への参照を他の場所に保持していないことも確信しています。

再び必要になった場合に備えて、UIImageViewが画像をメモリに保持している可能性はありますか?

私がやっていることは良い方法ですか?(私はこれに触発されました

4

1 に答える 1

3

簡単なテストの結果、Interface Builder で画像が設定されている画像ビューは、何らかのキャッシュを行っているように見えると推測されます。で使用されているのと同じキャッシングメカニズムであると思います。imageNamedそのドキュメントには次のように書かれています:

一度しか表示されない画像ファイルがあり、それがシステムのキャッシュに追加されないようにしたい場合は、代わりに を使用して画像を作成する必要がありますimageWithContentsOfFile:。これにより、使い捨てのイメージがシステム イメージ キャッシュから除外され、アプリのメモリ使用特性が改善される可能性があります。

このキャッシュがパージされる原因となるメモリ プレッシャーをシミュレートする方法はわかりません (実際のメモリ プレッシャーにつながる十分な割り当てを行う以外に)。さまざまなキャッシュは通常、実際のメモリ プレッシャには応答しますが、シミュレータの「Simulate Memory Warning」には奇妙に応答しません。(さらに、位置情報サービスのために物理デバイスでテストしています。)

ただし、Interface Builder でイメージを設定するのではなく、プログラムで実行する (および を使用せずに実行するimageNamed) ことで、これが実際に問題であるかどうかをテストできます。たとえば、次のようになります。

NSString *path = [[NSBundle mainBundle] pathForResource:@"imagename" ofType:@"png"];
self.imageView.image = [UIImage imageWithContentsOfFile:path];

私のテストでは、Interface Builder で画像が設定されたシーンを閉じると、代わりに上記のコードを使用した場合ほど多くのメモリは回復しません。

于 2013-09-11T00:28:15.527 に答える