NSUserDefaults没有写入磁盘

时间:2015-03-03 16:20:42

标签: objective-c nsuserdefaults

我有一个小背景Mac(菜单栏)应用程序,它使用一个简单值(字符串)的首选项。当我从Xcode启动应用程序时,即使在〜/ Library / Preferences中不存在plist,它也几乎总是将pref报告为已设置。在不进行任何代码库更改的情况下,似乎偶尔在后续启动时编写prefs文件。它确实有一个正常运行的帮助应用程序,如果它很重要,它有一个今日扩展。我尝试过使用[defaults synchronize]命令,但它没有做任何事情。我有其他应用程序工作正常。我在项目的其他任何地方都没有访问或设置NSUSerDefaults(包括绑定)

目前,我的应用不是沙盒。

一些示例代码:

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
[standardDefaults synchronize];
NSLog(@"value for key is %@", [standardDefaults valueForKey:@"firstTime"]);
//this always reports back as "Accepted" even when no pref exists 

if ([[standardDefaults valueForKey:@"first"] isEqualToString:@"Accepted"])
{
    NSLog(@"accepted");
    //always seen
}
else
{
    //rarely seen except in complete random times
    NSLog(@"first time");
    @try
    {
        NSLog(@"alert");

        [standardDefaults setObject:@"Accepted" forKey:@"first"];
        [standardDefaults synchronize];            
    }
    @catch (NSException *exception)
    {
        NSLog(@"exception is %@", exception);
    }
    @finally
    {

    }
 }

UDPATE:我现在在新的应用上看到这个,非沙盒。离奇。我创建了一个全新的mac / Cocoa应用程序,并使用了以下代码:

- (void)viewDidLoad 
{
  [super viewDidLoad];

  NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
  [standardDefaults synchronize];
  NSLog(@"value for key is %@", [standardDefaults valueForKey:@"firstTime"]);

  if (![standardDefaults valueForKey:@"firstTime"])
  {
    NSLog(@"settings value for key");
    [standardDefaults setValue:@"Whatever" forKey:@"firstTime"];
    [standardDefaults synchronize];
  }

  NSLog(@"value for key is %@", [standardDefaults valueForKey:@"firstTime"]);


  // Do any additional setup after loading the view.
}

第一次,它报告缺失。之后的每次尝试都会立即注册为pref,并报告为“what”,即使pref文件绝对不存在。

1 个答案:

答案 0 :(得分:1)

该文件通常由cfprefsd定期编写。您有时读/写实际与cfprefsd交谈的值,而不是磁盘上的文件。

同步时,会导致cfprefsd获取您已设置的值,但不能保证将其写入磁盘。

您所说的条件似乎表明偏好是第一次设置,即使您没有看到该文件出现在磁盘上,它也会读取值。这是预期的行为。

如果您想在写作前测试重置首选项,则需要使用以下内容清除它们:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

我相信自从引入云优惠同步以来,它就成了一个更明显的问题,文件并没有出现。修改文件从未被认为是稳定的。

如果你想从命令行中删除首选项,你应该使用defaults delete(我手头没有mac来为你提供确切的命令行)。