Wie eine NSMutableDictionary Instanz Variable richtig zu lösen, mit verschachtelten Wörterbücher, in Objective-C?
-
05-07-2019 - |
Frage
Ich habe eine Objective-C-Klasse, die so etwas wie folgt aussieht:
@interface myClass : NSObject
{
NSMutableDictionary *aDict;
}
Die Setter-Methode wie folgt aussieht:
- (void) setADict: (NSMutableDictionary *) newDict
{
[aDict release];
[newDict retain];
aDict = newDict;
}
Ich habe eine Instanz des Objekts erstellt, stellen Daten in Adict, und wollen nun von dem Objekt, um loszuwerden, seinen Speicher im Prozess aufzuräumen. Zwei Fragen:
1) Soll ich loslassen Adict in myClass 's dealloc Methode, wie dargestellt?
[aDict release];
=============================================== ==============================
2) Ich habe in mehreren Kindern Wörterbücher verschachtelt Adict , vertreten durch Keya und KeyB , etwa so:
// aDict:
{
keyA = {
keyA1 = "Hello world";
keyA2 = 1234;
};
keyB = {
keyB1 = Earth;
keyB2 = 25000;
};
}
Wird ein [Adict release] Meldung "propagieren Sie die Kette" und Bereinigung alle Kinder Wörterbücher innerhalb von Adict, einschließlich ihre Schlüssel / Wert-Objekte? Oder mache ich etwas anderes tun müssen, um sie loszuwerden?
Lösung
Ja.
Sammlung Objekte behalten die Dinge, sie zu sammeln, so dass, wenn die Sammlung freigegeben wird, gleicht es die mit einem Release halten.
Dann, wenn eines der Wörterbücher es auf der Hand hielt ausgeplant ist, wird er auch seine Schlüssel / Wert-Paare lösen, da das Wörterbuch eine Sammlung ist, und Sammlungsgegenstände behalten die Dinge, sie zu sammeln.
Das gleiche gilt für Arrays und setzt.
Sie haben jedoch einen Fehler im Code. Sie haben:
- (void) setADict: (NSMutableDictionary *) newDict
{
[aDict release];
[newDict retain];
aDict = newDict;
}
Betrachten wir den Fall, wenn newDict
das gleiche Objekt wie aDict
ist. Dann Sie das Wörterbuch lösen, wird freigegeben, und dann versuchen Sie es zu behalten, aber hoppla! Es ist nicht mehr da.
Es gibt drei Alternativen zu dieser Fixierung. Hier sind sie:
- (void) setADict: (NSMutableDictionary *) newDict
{
[aDict autorelease];
[newDict retain];
aDict = newDict;
}
- (void) setADict: (NSMutableDictionary *) newDict
{
if (aDict != newDict) {
[aDict release];
[newDict retain];
aDict = newDict;
}
}
- (void) setADict: (NSMutableDictionary *) newDict
{
[newDict retain];
[aDict release];
aDict = newDict;
}
ich die dritte ist einfachsten sagen würde, ist die zweite am schnellsten über die Zeit, und die erste ist meh . Die erste wird Ihre Autorelease-Pools verunstalteten (die Speicher aufblasen führen kann oder auch nicht). Die zweite und dritte sind gleichwertig in Bezug auf Sicherheit und Eigentum Speicherverwaltung. Allerdings wird die zweite Sie unnötige Methode Anrufe speichern, wenn Sie das gleiche Wörterbuch über Einstellung selbst passieren wird.
Andere Tipps
NSMutableDictionary
alle Objekte (Werte) auf Freigabe freigeben.
NSMutableDictionary
Kopien Schlüssel und senden für jeden Schlüssel / Wert-Paar Wert behalten, die Sie hinzugefügt. Cocoa Praxis ist, dass, wenn Bezug etwas behält, dann ist es für sie freigegeben wird.
sehen Sie NSMutableDictionary Referenz
Methoden, die Einträge in der -Wörterbücher, ob als Teil Initialisierung (für alle Wörterbücher) oder bei der Modifikation (für veränderbare Wörterbücher) -Kopieren jede Taste Argument (Schlüssel muss den NSCopying entspricht Protokoll) und fügen Sie die Kopien der Wörterbuch. Jeder entsprechende Wert Objekt erhält eine behalten Nachricht an sicherzustellen, dass sie nicht freigegeben werden bevor das Wörterbuch durch mit es.