web-dev-qa-db-ja.com

辞書をクリアする方法は?

私は現在、NSMutableDictionaryをクリアするために次のことを行っています

[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];

リリースラインは、実際にはディクショナリ内のオブジェクトをリリースしません。私はまだ次の行でそれらのすべてを見ることができます。ディクショナリがゼロになるのは、割り当て行が実行されるまでです。それを行うためのより良い方法はありますか?

19
4thSpace
34
Andy White

あなたは言う:

リリースラインは、実際にはディクショナリ内のオブジェクトをリリースしません。私はまだ次の行でそれらのすべてを見ることができます。ディクショナリがゼロになるのは、割り当て行が実行されるまでです。それを行うためのより良い方法はありますか?

可変ディクショナリの-releaseによってディクショナリの割り当てが解除された場合(保持カウントがゼロになります)、可変ディクショナリは含まれているすべてのオブジェクトを解放します。常に。

したがって、オブジェクトがリリースされていない場合、これは「修正」を提案しました...

[myDictionary removeAllObjects];
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];

...は、NSMutableDictionaryの元のインスタンスがリークされるという点でメモリリークです。

その結果、-removeAllObjectsを呼び出すと辞書が空になり、含まれているすべてのオブジェクトが解放されますしかし、まだメモリリークがあり、それを把握して修正する必要があります。


率直に言うと:

ディクショナリが上記の-releaseを受信したときに(-removeAllObjectsを呼び出さずに)ディクショナリ内のオブジェクトの割り当てが解除されていない場合は、メモリリークが発生しています。それは次のいずれかです:

  1. 辞書内のオブジェクトは余分な時間保持されています。

  2. 辞書にはまだ未解決の-retainがあります。

-removeAllObjectsを呼び出すと、オブジェクトは正しく(予想どおりに)割り当て解除されていると言うので、(2)である必要があります。コードを調べて、辞書の-retainが余分にある場所を見つけます。 Object Allocインストゥルメントを使用して、すべての保持がどこから来ているかを正確に把握できます。

30
bbum

-Andyが述べたように、removeAllObjectsは機能します。ただし、ディクショナリのオブジェクトのいずれかが自動解放された場合、またはディクショナリ自体が行のどこかで自動解放された場合、次にrunloopが終了するまで(自動解放プールが空になるとき)、それらは割り当て解除されません。 。

6
Ben Gottlieb
[aMutableDictionary removeAllObjects];

から Appleのドキュメント

(void)removeAllObjects

説明-エントリの辞書を空にします。各キーと対応する値オブジェクトには、リリースメッセージが送信されます。

可用性-iOS(2.0以降)

2
Dan