将NSDictionary保存到NSUserDefaults

50

我有一个NSMutableDictionary,并向其中添加了值(多个键值对)。现在我需要将此NSMutableDictionary保存到NSUserDefaults对象中。

1.) 我的代码如下;我不确定它是否正确,也需要知道如何从NSUSerDefault检索NSMutableDictionary?

2.) 在检索NSMutableDictionary后,我需要将其保存到NSDictionary中。我应该怎么做?

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

[dic addObject:@"sss" forKey:@"hi"];
[dic addObject:@"eee" forKey:@"hr"];

 [NSUserDefaults standardDefaults] setObject:dic forKey:@"DicKey"];
 [[NSUserDefaults standardDefaults] synchronize];

5
您还需要调用[[NSUserDefaults standardDefaults] synchronize];来保存。您具体遇到了什么问题?您已经提到了您想要做的事情,但没有提及您遇到的问题。您上方包含的代码(除了缺少的 [ )看起来很好。 - Sam
我需要保存一些键值对并从不同的视图中访问它。因此,我考虑使用NSUserDefaults和NSDictionary来实现这个目的。最后,我将使用这些值填充一个表格。 - shajem
除非您添加更多细节,否则我怀疑您将得到更多答案。您的设置很好。当您调用[[[NSUserDefaults standardDefaults] objectForKey:@"DicKey"]时,您是否找不到字典?请注意,这将是一个NSDictionary*类型,而不是NSMutableDictionary*。如果您想在视图之间操作数据,请考虑将数据存储在数据模型中,并将其传递给两个视图(或根据您希望数据有多通用/可见性提供单例访问器)。 - Sam
不建议将数据保存到用户默认设置中以便从另一个视图访问。您可以将其作为参数发送,或使用单例模式。 - Silviu St
1
请注意,不再需要使用“同步”:https://developer.apple.com/documentation/foundation/nsuserdefaults/1414005-synchronize?language=objc - Hibbem
2个回答

88

你的代码是正确的,但需要记住的一件事是 NSUserDefaults 不区分可变对象和不可变对象,因此当你获取一个值时它将是不可变的:

NSDictionary *retrievedDictionary = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"DicKey"];

如果你想要一个可变的字典,只需使用 mutableCopy

NSMutableDictionary *mutableRetrievedDictionary = [[[NSUserDefaults standardUserDefaults] objectForKey:@"DicKey"] mutableCopy];

请记住,使用 copy 操作会保留对象,因此您将成为所有者并负责释放它。 - Manlio
2
我正在使用 ARC。我需要将 NSMutableDictionary 保存到 NSUserDefaults 中,并从 NSUserDefaults 获取 NSDictionary。所以我想我必须使用您的第一种方法? - shajem
3
糟糕,需要使用mutableCopy而不是copy来获取可变字典。但是,对于您所描述的内容,您需要第一个版本。 - yuji

7
NSMutableDictionary *profileDictionary = [[NSMutableDictionary  alloc] init];
[profileDictionary setObject:txt_Username.text forKey:@"USERNAME_KEY"];
[profileDictionary setObject:txt_Password forKey:@"PASSWORD_KEY"];
[[NSUserDefaults standardUserDefaults] setObject:profileDictionary forKey:@"PROFILE_KEY"];
[[NSUserDefaults standardUserDefaults] synchronize];

这是您期望的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接