1

最も奇妙なことが起こっています...私はかなり複雑なUIViewControllerサブクラスを持っており、そのサブクラスをNIBファイルを介してロードしています。次の手順を実行するだけで、ビューをプッシュできます。

SecondViewController2 *secV = [[SecondViewController2 alloc]    initWithNibName:@"SecondViewController2" bundle:nil];
        self.secondViewController2 = secV;
[secV release];
[self.navigationController pushViewController:secondViewController2 animated:YES];
[secondViewController2 release];
secondViewController2 = nil;

ご覧のとおり、secondViewController2をリリースします。

問題は、初めて実行したときに、secondViewController2でALTHOUGHのdeallocメソッドが呼び出された場合でも、解放されていないように見える追加の2MBをインストルメントで観察していることです。どんな種類の漏れもありません、私はすでにチェックしました。

2回目、3回目、4回目など、以下のアクションを実行すると、deallocが呼び出され、メモリ内の追加は観察されません。それだけで、同じコードが1回目、2回目、3回目に実行されているが、約2MBがリリースされていないのは初めてなので、コードでエラーを実行しないことを確信しています。私が述べたように、secondViewController2のdeallocはまだ実行中です!!!

何か案が?Appleのメカニズムのバグですか?

4

1 に答える 1

2

まず、完全な実装を分析せずに質問に完全に答えることはできません。しかし、一般的に言えば、あなたの質問を正しく理解できれば、あなたが説明している状況は正しいと言えます。

確実にメモリ占有に永続的な影響を与えるアクションがあると考える必要があります。

たとえば、[UIImage imageNamed]` を介していくつかの画像をメモリにロードすると、その画像は画像キャッシュにも入れられ、画像をロードしたクラスの割り当てが解除されても空にはなりません。もう 1 つの良い例は、シングルトンです。シングルトン クラスは、最初にインスタンス化されたときにメモリを占有し、通常はメモリを解放しません (プログラムが終了する前に - シングルトンと言うときは、あらゆる種類の静的グローバルも読み取ります)。

これらは 2 つの例にすぎませんが、これ以外にも多くのケースが考えられます。また、独自のコードで実行することもできますが、コントローラーが使用するフレームワークで実行することもできます。この影響は、コントローラーが何らかの機能を使用するアプリでインスタンス化する最初のコントローラーである場合に発生する可能性が高くなります。しかし、基本的には、事前に知ることはできませんが、Instruments を介してプログラムの動作を検査した後にのみ知ることができます。

あなたにとって本当に価値のある情報は、コントローラークラスの連続したインスタンス化/解放時に、メモリ占有が増加しないということです。一般的に言えば、これは次の 2 つの兆候です。

  1. あなたのクラスにはメモリリークがありません。

  2. あなたのクラスはメモリを放棄していません。

1+2 が意味するのは、(コントローラーに関する限り) プログラムの全体的なメモリ消費量が一定であることです。(ただし、最初の使用時に支払うコストがあります)。

したがって、私の見解では、あなたの問題はせいぜいコントローラーによるメモリ使用量の「最適化」の 1 つです。私が言ったように、それらの 2MB が何らかのキャッシュから来ているのか、それとも他の何かから来ているのかを知るために、コントローラが何をしているのかを正確に知っておく必要があります (場合によっては、それがあなたの制御下にないこともあります)。

それが役に立てば幸い。

于 2012-12-23T22:27:13.133 に答える