3

私は MyViewController を持っています。これは UIViewController に基づいており、次のコードのように使用しました。

MyViewController *nextViewController = [[MyViewController alloc] init]; [self.navigationController pushViewController:nextViewController animated:YES]; [nextViewController release];

MyViewController には、ユーザー イベントを使用して、次のコードを記述します。

[self.navigationController popViewControllerAnimated:YES];

ここで、MyViewController の dealloc が呼び出されないことがわかりましたが、アプリをバックグラウンドに切り替えると、たとえばホーム ボタンを渡すと、dealloc メソッドが呼び出されました! これは大問題です!ユーザーが MyViewController に移動し、何度も何度も戻ったときに、多くの MyViewController が解放されないことがあり、アプリがバックグラウンドに移行したときにのみ、大量のメモリが解放される可能性があります。

だから、誰でもこれについて私を助けることができます、ありがとう!

4

1 に答える 1

8

明らかな理由は、何かが viewController を保持していることです。コードをよく見る必要があります。デリゲートを保持する場合があるため、デリゲートを使用するクラスで何かを行いますか。NSURLConnection はクラスを保持し、NSTimer も保持します。クラス内にコードを分散させて、クラスの保持カウントをログに記録し、その場所を見つけようとすることができます。これまでに示したコードでは、クラスはナビゲーション コントローラーによってのみ保持されるため、保持は 1 である必要があります。

また、ビューをポップする前に、ビューへの参照を取得し、アニメーションなしでポップしてから、保持カウントを報告するメッセージを送信します (これは、作成した新しいメソッドになります)。その新しいメソッドは、タイマーが動作しているかどうか、NSURLConnections など、他のこともログに記録できます。

于 2012-08-24T11:36:00.913 に答える