我试图在NSUserDefaults中存储一个空字典。
NSMutableDictionary* fruits = [NSMutableDictionary alloc];
[defaults setObject:fruits forKey:@"fruits"];
然后再检索它。
NSMutableDictionary* fruits = [[NSMutableDictionary alloc] initWithDictionary:[defaults objectForKey:@"fruits"]];
但是,检索字典会导致我的应用程序崩溃。为什么?如何在NSUserDefaults中存储字典?
答案 0 :(得分:17)
你得到一个不可变的字典。您不需要在另一个字典中“封装”它。如果你想让它变成可变写:
NSMutableDictionary* animals = [[defaults objectForKey:@"animals"] mutableCopy];
NSUserDefaults类提供了访问常用类型(如浮点数,双精度数,整数,布尔值和URL)的便捷方法。默认对象必须是属性列表,即(或集合的实例组合)的实例:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果要存储任何其他类型的对象,通常应将其存档以创建NSData实例。
即使您设置了一个,NSUserDefaults返回的值也是不可变的 可变对象作为值。例如,如果您设置了一个可变字符串 作为“MyStringDefault”的值,您以后检索的字符串 使用stringForKey:将是不可变的。
注意:用户默认系统(通过NSUserDefaults类以编程方式访问)使用属性列表来存储表示用户首选项的对象。此限制似乎从用户默认系统中排除了许多类型的对象,例如NSColor和NSFont对象。但是,如果对象符合NSCoding协议,则可以将它们存档为NSData对象,这些对象是属性列表兼容的对象。有关如何执行此操作的信息,请参阅“”在用户默认值中存储NSColor“”;虽然本文主要关注NSColor对象,但该过程可以应用于任何可以存档的对象。
答案 1 :(得分:3)
您可以使用:
保存:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mutableArray];
[[NSUserDefaults standardUserDefaults] setObject:stack forKey:@"Your Key"];
提取:
NSMutableArray *mutableArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
答案 2 :(得分:1)
您需要初始化字典并稍后将其设置为对象。这种方式有效,它与您的示例相同,但只需正确初始化。
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);
现在我得到日志控制台和应用程序不会崩溃:
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;
}
答案 3 :(得分:0)
NSMutableDictionary* fruits = [NSMutableDictionary alloc];
应该是
NSMutableDictionary* fruits = [[NSMutableDictionary alloc] init];
您需要在分配对象后始终初始化对象。