2

我试图这样做以在 NSUserDefaults 中存储一个空字典。

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

然后稍后再检索它。

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

但是,检索字典会使我的应用程序崩溃。为什么?如何在 NSUserDefaults 中存储字典?

4

4 回答 4

19

你得到一个不可变的字典。您无需将其“封装”在另一本字典中。如果你想让它可变写:

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 对象,但该过程可以应用于任何可以归档的对象。

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

于 2012-04-12T06:38:45.777 回答
3

您可以使用:

节省:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mutableArray];
[[NSUserDefaults standardUserDefaults] setObject:stack forKey:@"Your Key"];

取回:

NSMutableArray *mutableArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
于 2012-04-12T07:15:29.320 回答
2

您需要初始化您的字典并稍后将其设置为对象。这种方式有效,它与您的示例相同,但只是正确初始化。

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;
}
于 2012-04-12T06:46:41.567 回答
0
NSMutableDictionary* fruits = [NSMutableDictionary alloc];

应该

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

您需要始终在分配对象后对其进行初始化。

于 2012-04-12T06:47:14.433 回答