objective-c - NS用户默认值 : Updating data in plist

标签 objective-c macos cocoa

我正在使用[NSUserDefaults standardUserDefaults]保存应用程序首选项,其中有一些项目,其中之一是一个充满字典的数组。我想删除该数组中的第一项,所以我尝试如下操作:

[[[NSUserDefaults standardUserDefaults] objectForKey:accounts] removeObjectAtIndex:0];

这确实会删除索引 0 处的数组项,但不会更新 plist 文件。但是,当我这样做时

[[NSUserDefaults standardUserDefaults] removeObjectForKey:accounts];

它会删除所有项目并更新 plist 文件。为什么第一行不将数据保存到plist?

最佳答案

文档指出从 NSUserDefaults 返回的值是不可变的。我认为这意味着如果您检索一个值(例如通过 objectForKey:),然后修改该值,则更改将不会保留回用户默认值。您需要通过 setObject:forKey: 自行保存更改。

来自https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

Values returned from NSUserDefaults are immutable, even if you set a mutable object as the value. For example, if you set a mutable string as the value for "MyStringDefault", the string you later retrieve using stringForKey: will be immutable.

虽然真正奇怪的是以下内容似乎有效......(但不会持久更改)。

  [[NSUserDefaults standardUserDefaults] setObject:@[@{@"hello" : @"1234"}, @{@"bye" : @"aoeu"}] forKey:@"accounts"];
  // Outputs both dictionaries
  NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"accounts"]);
  [[[NSUserDefaults standardUserDefaults] objectForKey:@"accounts"] removeObjectAtIndex:0];
  // Outputs only 1 dictionary
  NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"accounts"]);

关于objective-c - NS用户默认值 : Updating data in plist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13597421/

相关文章:

ios - 应用程序在 tableview 的 reloadData 方法上崩溃

objective-c - 运行时 ScrollView 中的额外空间(插图)

macos - 在没有 Docker 工具箱的情况下在 OSX 上安装 docker-machine

macos - 如何在 Mac 上为 google protobuf 设置 LD_LIBRARY_PATH (也可能是 DYLD_)?

macos - 在 NSAttributedString 的一部分周围绘制边框

objective-c - 在 uiwebview 中播放本地视频

objective-c - iOS:即使用户当前语言不是英语,也使用 en.lproj 资源

macos - 如何发布一个用flutter编写的macos应用

cocoa - NSOpenGLView 上的 OpenGL 像素加倍

swift - 如何配置 WKWebView 来填充 NSWindow?