私は現在、NSMutableDictionaryをクリアするために次のことを行っています
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];
リリースラインは、実際にはディクショナリ内のオブジェクトをリリースしません。私はまだ次の行でそれらのすべてを見ることができます。ディクショナリがゼロになるのは、alloc行が実行されるまでです。それを行うためのより良い方法はありますか?
私は現在、NSMutableDictionaryをクリアするために次のことを行っています
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];
リリースラインは、実際にはディクショナリ内のオブジェクトをリリースしません。私はまだ次の行でそれらのすべてを見ることができます。ディクショナリがゼロになるのは、alloc行が実行されるまでです。それを行うためのより良い方法はありますか?
現時点ではテストできませんが、のremoveAllObjects
方法を試しましたNSMutableDictionary
か?
あなたは言う:
リリースラインは、実際にはディクショナリ内のオブジェクトをリリースしません。私はまだ次の行でそれらのすべてを見ることができます。ディクショナリがゼロになるのは、alloc行が実行されるまでです。それを行うためのより良い方法はありますか?
-release
可変ディクショナリの割り当てが解除されると(保持カウントがゼロになります)、可変ディクショナリは含まれているすべてのオブジェクトを解放します。いつも。
したがって、オブジェクトが解放されていない場合、これは「修正」を提案します...
[myDictionary removeAllObjects];
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];
...は、NSMutableDictionaryの元のインスタンスがリークされるという点でメモリリークです。
その結果、呼び出すと辞書-removeAllObjects
が空になり、含まれているすべてのオブジェクトが解放されますが、それでもメモリリークが発生するため、把握して修正する必要があります。
率直に言うと:
-release
ディクショナリが上記を(を呼び出さずに)受信したときにディクショナリ内のオブジェクトの割り当てが解除されていない場合-removeAllObjects
は、メモリリークが発生しています。それは次のいずれかです:
辞書内のオブジェクトは余分な時間保持されています。
-retain
辞書にはまだ傑出
したものがあります。
を呼び出すと、オブジェクトは正しく(予想どおりに)割り当て解除されていると言うので、-removeAllObjects
(2)である必要があります。コードを調べて-retain
、辞書の余分な部分がある場所を見つけます。Object Allocインストゥルメントを使用して、すべての保持がどこから来ているかを正確に把握できます。
-Andyが述べたように、removeAllObjectsは機能します。ただし、ディクショナリのオブジェクトのいずれかが自動解放された場合、またはディクショナリ自体がラインのどこかで自動解放された場合、次に実行ループが終了するまで(自動解放プールが空になるとき)、それらは割り当て解除されません。 。
[aMutableDictionary removeAllObjects];
Appleのドキュメントから:
(void)removeAllObjects
説明-エントリの辞書を空にします。各キーと対応する値オブジェクトには、リリースメッセージが送信されます。
可用性-iOS(2.0以降)