0

アプリデリゲートで作成および保存されるARCとNSCacheを使用しています。次に、アプリ デリゲートを介してコントローラーから呼び出します。NSCache は、URL から読み込まれた画像を保存し、メモリ使用量が急速に増加します。プロファイラーで実際のメモリ使用量を確認すると、アプリのメモリ使用量は 320 MB にも達しますが、割り当てでは 20 ~ 30 MB しか割り当てられていないと表示されます。

アプリのデリゲートで、キャッシュを次のように設定します (これは ivar です)。

cache = [[NSCache alloc] init];
[cache setCountLimit:100];
[cache setTotalCostLimit:1500000];
[cache setEvictsObjectsWithDiscardedContent:YES];

NSCache を試すためのボタンを実装しました。クリックすると次のように呼び出されます。

- (IBAction)eraseCache:(id)sender {
    [[appDelegate cache] removeAllObjects];
}

プロファイラーでは、使用されるメモリは減りませんが、実際に画像の取得が再開されるため、オブジェクトが削除された場所がわかります。ARCを使用して、このメモリ使用量を自由に解放するにはどうすればよいですか? キャッシュのサイズを取得して、いつ解放するかを知るにはどうすればよいですか?

4

1 に答える 1

0

ARC では、オブジェクトへのポインターがなくなると、自動的に解放されます。オブジェクトへのポインターのみがキャッシュにあった場合、それらは解放されています。

実際にオブジェクトを削除する必要はないことに注意してください。ポインターを新しいオブジェクトに割り当てた場合 (その結果、古いオブジェクトを指しなくなった場合)、古いオブジェクトの割り当てが解除されます。

Ex:
NSArray *array = [NSArray new];
array = [NSArray new]; //the original array gets deallocated because nothing points to it.

NSCache クラス リファレンスから:

NSCache クラスにはさまざまな自動削除ポリシーが組み込まれており、システムのメモリを過度に使用しないようになっています。他のアプリケーションがメモリを必要とする場合、システムはこれらのポリシーを自動的に実行します。これらのポリシーが呼び出されると、キャッシュからいくつかのアイテムが削除され、メモリ フットプリントが最小限に抑えられます。

于 2012-07-27T16:25:05.307 に答える