iOS NSDictionary 保存到 NSUserDefaults 不保存值

Posted

技术标签:

【中文标题】iOS NSDictionary 保存到 NSUserDefaults 不保存值【英文标题】:iOS NSDictionary saved to NSUserDefaults not saving values 【发布时间】:2014-03-19 09:53:27 【问题描述】:

我正在尝试将带有数组值的 NSDictionary 保存到 NSUserDefaults,但遇到了一些奇怪的问题。

我的NSDictionaryNSStrings 对应keys,每个valueNSArrayNSNumbers。当我打印字典时,一切都很好。我把这本词典写给NSUserDefaults,如果我马上把它读回来,一切都很好。使用这个一切都很好:

[[NSUserDefaults standardUserDefaults] setObject:self.selectedOptionPositions 
                                          forKey:PREF_OPTIONS_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];

//THIS PRINT EVERYTHING OUT EXACTLY AS IT SHOULD!       
NSLog(@"read after write: %@", [[NSUserDefaults standardUserDefaults] 
                                 objectForKey:PREF_OPTIONS_KEY]);

当我创建一个处理此问题的类的新实例时,问题就出现了。当我创建类的新实例并在 init 方法中检查 NSDictionary 时,如下所示:

NSLog(@"read initial: %@", [[NSUserDefaults standardUserDefaults] 
                              objectForKey:PREF_OPTIONS_KEY]);

当我打印该日志时,NSDictionary 包含所有 ,但所有 values 现在都是空的!重新创建类后所有新添加的keys 都存在,但没有values 持续存在。

这里有什么问题?控制台中没有警告或错误。

【问题讨论】:

在保存到 NSUserDefaults 时尝试使用 [self.selectedOptionPositions 复制]。 【参考方案1】:

试试这个:

您可以使用 NSKeyedArchiver 将您的字典写入 NSData,您可以将其存储在首选项中。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.selectedOptionPositions];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:PREF_OPTIONS_KEY];

用于检索数据:

NSData *dictionaryData = [defaults objectForKey:PREF_OPTIONS_KEY];
NSDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:dictionaryData];

正如ios Developer Documentation for NSKeyedArchiver 所说:

NSKeyedArchiver 是 NSCoder 的一个具体子类,它提供了一种方法 将对象(和标量值)编码为与体系结构无关的 可以存储在文件中的格式。当您归档一组 对象,每个对象的类信息和实例变量 被写入存档。 NSKeyedArchiver 的同伴类, NSKeyedUnarchiver,解码存档中的数据并创建一组 与原始集合等效的对象。

【讨论】:

您能否解释一下这段代码的不同之处?供大家理解。 另外你应该使用 NSKeyedUnarchiver 来取回字典。示例:NSDictionary * userInfo = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:PREF_OPTIONS_KEY]];

以上是关于iOS NSDictionary 保存到 NSUserDefaults 不保存值的主要内容,如果未能解决你的问题,请参考以下文章

将UITextfield中的每个字符记录到IOS中的NSDictionary中

无法创建 Plist 文件。 iOS+NSDictionary+JSON

从 NSDictionary 保存数据到 NSDictionary

带有 NSDictionary 的数组不想保存到 standardUserDefaults

Swift:将 NSDictionary 保存到文件中,因为 NSUserDefaults 会变慢

将 NSDictionary 保存到 plist