iOS NSDictionary保存到NSUserDefaults而不保存值

shi*_*tix 3 objective-c nsdictionary nsuserdefaults nsarray ios

我试图保存一个NSDictionary数组值,NSUserDefaults但有一些奇怪的麻烦.

NSDictionary已经NSStringskeysvalue一个NSArrayNSNumbers.当我打印字典时,一切都很好.我写这本字典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]);
Run Code Online (Sandbox Code Playgroud)

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

NSLog(@"read initial: %@", [[NSUserDefaults standardUserDefaults] 
                              objectForKey:PREF_OPTIONS_KEY]);
Run Code Online (Sandbox Code Playgroud)

当我打印该日志记录时,它NSDictionary包含所有键,但所有values现在都是空的!keys重新创建类后,所有新添加的都存在,但没有values持久化.

这可能有什么问题?控制台中没有警告或错误.

Suj*_*han 14

试试这个:

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

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.selectedOptionPositions];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:PREF_OPTIONS_KEY];
Run Code Online (Sandbox Code Playgroud)

用于检索数据:

NSData *dictionaryData = [defaults objectForKey:PREF_OPTIONS_KEY];
NSDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:dictionaryData];
Run Code Online (Sandbox Code Playgroud)

与在NSKeyedArchiveriOS开发人员文档中一样,它说:

NSKey的具体子类NSKeyedArchiver提供了一种将对象(和标量值)编码为可以存储在文件中的独立于体系结构的格式的方法.归档一组对象时,每个对象的类信息和实例变量都将写入归档.NSKeyedArchiver的伴侣类NSKeyedUnarchiver对存档中的数据进行解码,并创建一组与原始集相当的对象.

  • 您还应该使用NSKeyedUnarchiver来获取字典.例如:NSDictionary*userInfo = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:PREF_OPTIONS_KEY]]; (2认同)