19

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

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

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

4

4 に答える 4

34

現時点ではテストできませんが、のremoveAllObjects方法を試しましたNSMutableDictionaryか?

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html#//apple_ref/occ/instm/NSMutableDictionary/removeAllObjects

于 2009-12-31T21:31:33.400 に答える
30

あなたは言う:

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

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

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

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

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

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


率直に言うと:

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

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

  2. -retain辞書にはまだ傑出 したものがあります。

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

于 2009-12-31T21:42:20.027 に答える
6

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

于 2009-12-31T21:37:47.553 に答える
3
[aMutableDictionary removeAllObjects];

Appleのドキュメントから:

(void)removeAllObjects

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

可用性-iOS(2.0以降)

于 2014-01-27T17:36:58.930 に答える