Wie eine NSMutableDictionary Instanz Variable richtig zu lösen, mit verschachtelten Wörterbücher, in Objective-C?

StackOverflow https://stackoverflow.com/questions/1402778

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top