【问题标题】:Saving NSDictionary to NSUserDefaults将 NSDictionary 保存到 NSUserDefaults
【发布时间】:2012-03-30 16:40:13
【问题描述】:

我有一个 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];

【问题讨论】:

  • 您还需要拨打[[NSUserDefaults standardDefaults] synchronize];进行保存。你到底在挣扎什么?您已经提到了您想要做的事情,但没有提到您遇到问题的地方。您在上面包含的代码(除了缺少的[)看起来不错。
  • 我需要保存一些键值对并从不同的视图访问它。所以我想为此使用 NSUserDefaults 以及 NSDictionary。最后,我将不得不用这些值填充一个表。
  • 除非您添加更多细节,否则我怀疑您会得到更多答案。你设置的很好。你打电话[[[NSUserDefaults standardDefaults] objectForKey:@"DicKey"]时没有找到字典吗?请注意,这将是 NSDictionary* 类型,而不是 NSMutableDictionary*。如果您想跨视图操作数据,请考虑将数据存储在您传递给两个视图的数据模型中(或根据您希望数据的通用/可见程度在其上提供单例访问器)。
  • 不建议保存为用户默认值以便从另一个视图访问它。您可以作为参数发送,也可以使用单例
  • 请注意,不再需要使用“同步”:developer.apple.com/documentation/foundation/nsuserdefaults/…

标签: iphone objective-c ios cocoa-touch


【解决方案1】:

您的代码是正确的,但您必须记住的一件事是NSUserDefaults 不区分可变对象和不可变对象,因此当您取回它时,它将是不可变的:

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

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

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

【讨论】:

  • 请记住,使用 copy 您保留了该对象,因此您将成为所有者并负责释放它。
  • 我正在使用 ARC。而且,我需要将 NSMutableDictionary 保存到 NSUser Defaults,并从 NSUserDefaults 获取 NSDictionary。所以我猜我必须使用你的第一种方法?
  • 糟糕,需要使用mutableCopy 而不是copy 来获取可变字典。但是,是的,根据您的描述,您想要第一个版本。
【解决方案2】:
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];

这是你所期望的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2013-11-26
    • 1970-01-01
    • 2012-06-13
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多