2014-03-19 116 views
2

我想保存NSDictionary与数组值但我有一些奇怪的麻烦。iOS NSDictionary保存到NSUserDefaults不保存值

NSDictionaryNSStringskeys每个valueNSNumbers一个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包含所有的,但所有的values现在都空!所有新添加的keys在重新创建课程后都存在,但不存在values

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

+0

尝试使用[self.selectedOptionPositions copy]保存到NSUserDefaults。 – ZeMoon

回答

13

试试这个:

可以使用的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,对档案中的数据进行解码,并创建一组等效于原始集的对象 。

+0

你能否解释一下这段代码的区别?为了大家的理解。 – ZeMoon

+2

另外您应该使用NSKeyedUnarchiver获取字典。 Exmaple:NSDictionary * userInfo = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:PREF_OPTIONS_KEY]]; – Natarajan

+0

感谢您的好评... –