iOS NSDictionary 保存到 NSUserDefaults 不保存值
Posted
技术标签:
【中文标题】iOS NSDictionary 保存到 NSUserDefaults 不保存值【英文标题】:iOS NSDictionary saved to NSUserDefaults not saving values 【发布时间】:2014-03-19 09:53:27 【问题描述】:我正在尝试将带有数组值的 NSDictionary
保存到 NSUserDefaults
,但遇到了一些奇怪的问题。
我的NSDictionary
有NSStrings
对应keys
,每个value
是NSArray
的NSNumbers
。当我打印字典时,一切都很好。我把这本词典写给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