2009-12-31 18 views
18

Ich mache folgendes zur Zeit nicht ein NSMutableDictionaryWie lösche ich ein Wörterbuch?

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

Die Freigabe Linie zu räumen eigentlich keine Objekte im Wörterbuch lösen. Ich kann sie immer noch in der nächsten Zeile sehen. Erst wenn die Zuweisungszeile ausgeführt wird, wird das Wörterbuch auf Null gesetzt. Gibt es einen besseren Weg, es zu tun?

Antwort

32
+0

Sie haben Recht. Aus irgendeinem Grund tauchte es nicht im Code-Hinweis auf, als ich es anfänglich versuchte ... also nahm ich an, dass es nicht verfügbar war. Ich sehe es jetzt. Vielen Dank. – 4thSpace

+5

Dies beantwortet die Frage nicht. Mit 'Freigabe' im Wörterbuch werden alle enthaltenen Objekte freigegeben. 4thSpace hat ein anderes Problem. – bbum

+0

Ich möchte nur wiederholen, dass, wenn Sie ein NSDictionary freigeben und die Objekte nicht freigegeben werden, das bedeutet, dass diese Objekte einen retainCount von mehr als eins haben, was bedeutet, dass sie überbrückt werden oder anderswo nicht ordnungsgemäß freigegeben werden. Wenn Sie die Objekte zum Wörterbuch hinzufügen, geben Sie sie richtig frei? – lucius

6

-removeAllObjects funktionieren wird, wie Andy erwähnt. Wenn jedoch eines Ihrer Wörterbuchobjekte automatisch freigegeben wird oder wenn das Wörterbuch selbst an einer bestimmten Stelle automatisch wieder freigegeben wurde, werden sie erst freigegeben, wenn der Runloop das nächste Mal beendet wird (wenn der Autorelease-Pool leer ist). .

30

Sie sagen:

Die Freigabe Linie nicht wirklich Release alle Objekte im Wörterbuch. Ich kann immer noch alle auf der nächste Zeile sehen. Erst wenn die Zeile ausgeführt wird, wird das Wörterbuch auf Null gesetzt. Gibt es einen besseren Weg , es zu tun?

Wenn -release des wandelbaren Wörterbuch bewirkt, dass das Wörterbuch ausgeplant werden - fällt die Zählung auf Null halten - dann wird das veränderbare Wörterbuch wird lösen alle Objekte enthalten. Immer.

Wenn also die Objekte nicht freigegeben werden, dann ist dieses „fix“, schlug ...

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

... ist ein Speicher, in Leck, dass die ursprüngliche Instanz von NSMutableDictionary durchgesickert wird.

Als Ergebnis -removeAllObjectswird leer das Wörterbuch und lassen Sie alle darin enthaltenen Objekte aufrufen, aber Sie haben noch ein Speicherleck, das Sie herausfinden und beheben sollte.


zu stumpf sein:

Wenn die Objekte in Ihrem Wörterbuch nicht freigegeben werden, wenn das Wörterbuch die oben -release empfängt (ohne -removeAllObjects Aufruf), dann gibt es einen Speicherverlust. Es ist entweder:

  1. Die Objekte im Wörterbuch haben eine zusätzliche Zeit beibehalten.

  2. Es gibt immer noch eine hervorragende -retain auf dem Wörterbuch.

Da Sie die Objekte sagen korrekt zu sein (wie in, wie erwartet) ausgeplant, wenn Sie -removeAllObjects nennen, dann muss es sein (2). Schauen Sie sich Ihren Code an und finden Sie heraus, wo es ein extra -retain des Wörterbuchs gibt. Sie können das Objekt Objekt Alloc verwenden, um genau herauszufinden, woher alle Rücklagen stammen.

+0

-removeAllObjects funktioniert ohne Aufruf von -release. Sagst du, dass das immer noch ein Speicherleck ist? – 4thSpace

+0

Ja. Das Wörterbuch wird durchgesickert. – bbum

2
[aMutableDictionary removeAllObjects]; 

von Apple's documentation:

(void)removeAllObjects

Beschreibung - Leert das Wörterbuch seiner Einträge. Jedem Schlüssel und entsprechenden Wertobjekt wird eine Freigabenachricht gesendet.

Verfügbarkeit - iOS (2.0 und höher)