2012-04-12 9 views
2

Ich habe versucht, dies zu tun, um ein leeres Wörterbuch in NSUserDefaults zu speichern.Wie kann ich ein NSMutableDictionary zu und von NSUserDefaults speichern und abrufen?

NSMutableDictionary* fruits = [NSMutableDictionary alloc]; 
[defaults setObject:fruits forKey:@"fruits"]; 

und dann später, um es abzurufen.

NSMutableDictionary* fruits = [[NSMutableDictionary alloc] initWithDictionary:[defaults objectForKey:@"fruits"]]; 

Das Abrufen des Wörterbuchs stürzt jedoch meine Anwendung ab. Warum? Wie speichere ich ein Wörterbuch in NSUserDefaults?

+0

Sind Sie sicher, dass der Absturz passiert, wenn er abgerufen wird? In der ersten Zeile fehlt 'init', was zu einem Absturz führen sollte, wenn es zu' defaults' hinzugefügt wird. – Dondragmer

Antwort

17

Sie erhalten ein unveränderliches Wörterbuch zurück. Sie müssen es nicht in einem anderen Wörterbuch "kapseln". Wenn Sie es wandelbar Schreib machen wollen:

NSMutableDictionary* animals = [[defaults objectForKey:@"animals"] mutableCopy]; 

Die NSUserDefaults Klasse bequeme Methoden für den Zugriff auf gemeinsame Typen wie Schwimmern bietet, verdoppelt, ganzen Zahlen, Boolesche Werte und URLs. Ein Standardobjekt muss eine Eigenschaftsliste sein, dh eine Instanz von (oder für Sammlungen eine Kombination von Instanzen von): NSData, NSString, NSNumber, NSDate, NSArray oder NSDictionary. Wenn Sie einen anderen Objekttyp speichern möchten, sollten Sie ihn normalerweise archivieren, um eine Instanz von NSData zu erstellen.

Von NSUserDefaults zurückgegebene Werte sind unveränderbar, auch wenn Sie ein veränderbares Objekt als Wert festlegen. Wenn Sie beispielsweise eine veränderbare Zeichenfolge als den Wert für "MyStringDefault" festlegen, wird die Zeichenfolge, die Sie später abrufen mithilfe von StringForKey: wird unveränderlich sein.

Hinweis: Das Benutzerstandardsystem, auf das Sie programmgesteuert über die NSUserDefaults-Klasse zugreifen, verwendet Eigenschaftslisten zum Speichern von Objekten, die Benutzereinstellungen darstellen. Diese Einschränkung scheint viele Arten von Objekten, wie beispielsweise NSColor- und NSFont-Objekte, vom Benutzerstandardsystem auszuschließen. Wenn Objekte jedoch dem NSCoding-Protokoll entsprechen, können sie in NSData-Objekten archiviert werden, bei denen es sich um Eigenschaftenlisten-kompatible Objekte handelt. Informationen dazu finden Sie unter "Speichern von NSColor in Benutzereinstellungen". Obwohl sich dieser Artikel auf NSColor-Objekte konzentriert, kann die Prozedur auf jedes Objekt angewendet werden, das archiviert werden kann.

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsuserdefaults_Class/Reference/Reference.html

+0

Danke, warum bekomme ich ein unveränderliches Wörterbuch zurück? –

+0

Aktualisierte die Antwort; da NSDictionary eine Oberklasse von NSMutableDictionary ist und NSUserDefaults diese beim Speichern automatisch "konvertiert". – LuckyLuke

1

Sie benötigen Wörterbuch init und gesetzt ist später als Objekt. So funktioniert es, es ist das gleiche wie in Ihrem Beispiel, aber nur mit der richtigen Initialisierung.

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"someValue", @"someKey", nil]; 
[defaults setObject:dict forKey:@"slovnik"]; 
[dict release]; 
NSLog(@"READ: %@", [defaults objectForKey:@"slovnik"]); 
NSMutableDictionary *newDict = [[NSMutableDictionary alloc] initWithDictionary:[defaults objectForKey:@"slovnik"]]; 
NSLog(@"READ2: %@", newDict); 

Jetzt bekomme ich Konsole und App anmelden Absturz nicht:

2012-04-12 08:47:55.030 Test[12179:f803] READ: { 
someKey = someValue; 
} 
2012-04-12 08:47:55.031 Test[12179:f803] READ2: { 
someKey = someValue; 
} 
0
NSMutableDictionary* fruits = [NSMutableDictionary alloc]; 

sollte

NSMutableDictionary* fruits = [[NSMutableDictionary alloc] init]; 

Sie müssen sein, Objekte zu immer initialisieren, nachdem sie zugeordnet werden.

3

Sie können:

sparen NSData * data = [NSKeyedArchiver archivedDataWithRootObject: MutableArray]; [[NSUserDefaults standardUserDefaults] setObject: Stapel forKey: @ "Your Key"];

Abrufen: NSMutableArray * mutableArray = [NSKeyedUnarchiver unarchiveObjectWithData: data];