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