我有一个小背景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文件绝对不存在。
答案 0 :(得分:1)
该文件通常由cfprefsd定期编写。您有时读/写实际与cfprefsd交谈的值,而不是磁盘上的文件。
同步时,会导致cfprefsd获取您已设置的值,但不能保证将其写入磁盘。
您所说的条件似乎表明偏好是第一次设置,即使您没有看到该文件出现在磁盘上,它也会读取值。这是预期的行为。
如果您想在写作前测试重置首选项,则需要使用以下内容清除它们:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
我相信自从引入云优惠同步以来,它就成了一个更明显的问题,文件并没有出现。修改文件从未被认为是稳定的。
如果你想从命令行中删除首选项,你应该使用defaults delete
(我手头没有mac来为你提供确切的命令行)。