3

最近、UINavigationController を使用するようにアプリを変更しました。以前は UINavigationBar を使用していましたが、カスケード subView を追加していましたが、これは少し面倒でした。

メモリ使用量の問題に直面しています。Leaks ツールにはリークは表示されませんが、私が作成して UINavigationController に追加した ViewControllers は決してリリースされないようです。そのため、新しい VC を作成して NavigationController の戻るボタンを押すたびに、メモリ使用量が増加します。

この方法で VC を作成して追加するだけです。

DetailViewController* detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
// setups
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];

アプリは ViewControllerdeallocviewDidUnloadメソッドを通過しません。戻るボタンを押すたびにこれらを呼び出すべきではありませんか?

多くのチュートリアルを検索し、Apple のメモリ管理を読みましたが、NavigationController を使用する場合のメモリ内での VC の寿命については何もありません。

4

2 に答える 2

5

たぶん、あなたは何か間違ったことをしているわけではなく、代わりにこのようなことに直面しています

ブログ投稿では、IBOutlets を手動でリリースする必要があるかどうかが問題でした。結局のところ、私たちはそうすべきです。これは iOS 3.1.3 で再現可能でしたが、iOS 4.0 ではまだテストしていません。

2 番目のアプローチは、View Controller の保持および解放メソッドをオーバーライドし、保持カウントを出力することです。一部のビューコントローラーの dealloc メソッドが呼び出されなかったという同様の問題があったため、このメソッドをオーバーライドして、誰かがまだ保持されているかどうかを確認しました。結局のところ、そうでした。

編集:
保持カウントを出力すると、フレームワークが原因で最大 98 に達することがあるので、心配する必要はありません。

最後の保持カウントが 2 のままで、dealloc メソッドが呼び出されない場合は、まだ保持している人がいます。

この場合、他の場所で検索する必要があります。

たとえば、この同じ問題で遭遇した別の問題:

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateUI) userInfo:nil repeats:YES]

UIを常に更新する。しかし、私が忘れていたのは、NSTimer がターゲットオブジェクト (ViewController) を保持するということでした。NSTimer はビュー コントローラーを保持しているため、誰か (NSTimer) がまだ保持しているため、dealloc が呼び出されることはありません。したがって、NSTimer BEFORE dealloc メソッドを無効にして、View Controller を適切に解放する必要があります。

以下のコメントに対応
する Edit2: 宣言されたプロパティを保持すると、次のようになります (例):

- (void)setTarget:(id)value {
  if (value != target) { 
    [target release];
    target = [value retain];
}

したがって、最初に現在の self.target を解放してから、新しい値を保持します。nil を割り当てているため、後でターゲットは nil になります。プロパティの詳細については、Apple doc を参照してください。

于 2010-07-13T10:02:49.397 に答える
2

私もこれを見たことがあります。あなたが指摘したように、私はドキュメントで決定的なものを見たことがありませんが、メモリが必要になるまでそれらはメモリに保持されると信じています. これにより、アプリはさまざまなビュー間をすばやく移動できるため、パフォーマンスの観点からは理にかなっています。

要するに、私はそれについて心配する必要はありません。シミュレーターでメモリ不足の警告を発して、実際に VC が解放されるかどうかを確認できます。

于 2010-07-12T16:32:13.717 に答える