iOS中的NSDictionary保存到NSUserDefaults中不保存值

3
我正在尝试将值为数组的NSDictionary保存到NSUserDefaults中,但出现一些奇怪的问题。
我的NSDictionary的键是NSStrings,每个值都是由NSNumbers组成的NSArray。当我打印字典时,一切都正常。我将此字典写入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 包含所有的 keys,但是所有的 values 现在都为空!即使在重新创建类之后,所有新添加的 keys 都存在,但是没有任何 values 持续存在。
这里可能出了什么问题?控制台中没有警告或错误。

尝试在保存到NSUserDefaults时使用[self.selectedOptionPositions copy]。 - ZeMoon
1个回答

14

试试这个:

你可以使用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开发人员文档中关于NSKeyedArchiver的说明:

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


你能否解释一下这段代码的不同之处吗?为了大家的理解。 - ZeMoon
2
另外,您应该使用NSKeyedUnarchiver来获取字典。例如:NSDictionary * userInfo = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:PREF_OPTIONS_KEY]]; - Natarajan

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