6

アプリケーションがバックグラウンド実行状態に入ると、ダーティメモリの使用量を増やすことができます。アップルのビデオでは、ダーティメモリを可能な限り減らす必要があると述べられています。

しかし、私のアプリでは、ナビゲーションコントローラーを使用してビューをプッシュおよびポップしています。約20の異なるページから移動した後、ダーティメモリの使用量は30MB程度に達します。

また、「dismissModalViewControllerAnimated」および「popViewControllerAnimated」では、deallocは呼び出されません。

私には2つの疑問があります:

  1. どのくらいのダーティメモリがライブになるのに許容されますか?
  2. 戻るボタンをサポートするナビゲーションコントローラーの代替手段は何ですか?

前もって感謝します。

4

2 に答える 2

4

dealloc が呼び出されていない場合でも、UIViewControllers が保持されている可能性があります。

おそらく、これらのUIViewControllersにデリゲートまたは他のクラスを設定していて、ツリーをバックアップして参照していました(循環参照)。

これをデバッグする方法は、UIViewController で保持と解放をオーバーロードし、ブレーク ポイントを設定して、retainCount をログに記録することです。

これは、私がまだ何かを保持している理由がわからないときに、非常に役立つ魔法のスニペットです。

- (id)retain
{
    NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
    return [super retain];
}
- (void)release
{
    NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
    [super release];
}
- (id)autorelease
{
    NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
    return [super autorelease];
}

__PRETTY_FUNCTION__CLang の特別な隠しマクロで、かなりの Objective-C 関数名を char 配列として指定します。

于 2011-02-11T08:09:08.167 に答える
0
  1. iOS がメモリ不足になると、最も多くのメモリを使用しているバックグラウンド プロセスを強制終了しようとします。したがって、絶対的に適切な数値はありませんが、使用するメモリの量を最小限に抑えることは良い考えです。30Mb のままにしておくことは、アプリが強制終了されることを保証することと同じです。
  2. UI を変更したい場合を除きUINavigationController、戻るボタンを処理するために他のものを使用する必要はありません。ここでの問題はdealloc、ポップまたは却下で呼び出されない場合、メモリリークがあることだと思います

ほとんどすべてのビュー コントローラーには、効果的にキャッシュされ、アプリがフォアグラウンドに戻ったときに再生成できるデータがあります。アプリの実行中にメモリ警告が表示されたときに解放するデータについて考えてみてください。(メモリの警告に応答していますよね?) バックグラウンドに入ったときに解放されるべきものです。

于 2011-02-11T10:37:03.643 に答える