12

在使用 NSUserDefaults 时,我遇到了关于在 Xcode 5 上编写 osx 应用程序的问题。通常,我们只是[[NSUserDefaults standardUserDefaults] setObject:@"This is an object" forKey:@"Test"]用来记住用户的偏好。之后,应用程序将在 ~/Library/Preferences/application.bundle.identifier.plist 处生成一个 plist 文件。

问题是,在我删除 plist 文件后,应用程序仍然可以获得我存储的首选项。即使我尝试清理项目、重新启动 xcode、删除派生文件夹中的文件,也无法清除该 plist。我解决这个问题的唯一方法是重新启动系统,所以我猜内存中存储了一些东西。问题是如何清除这些存储的首选项?(我觉得调试测试的时候手动添加代码来清除偏好不太方便。)而且我试过Xcode 4.x之前的版本,没有这个问题。任何有兴趣的人都可以创建一个新的可可项目,并添加如下代码:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];    
[defaults setObject:@"This is an object." forKey:@"Test"];     
NSLog(@"%@", [defaults objectForKey:@"Test"]); 

在“applicationDidFinishLaunching”下。然后去删除~/Library/Preferences/application.bundle.identifier.plist。之后, [defaults setObject:@"This is an object." forKey:@"Test"]; 在您的代码中注释行:并再次运行应用程序。控制台仍会显示"This is an object." 我的环境是 Mavericks GM 和 Xcode 5.0(5a1413)。

希望这不仅仅是发生在我身上的事情,感谢任何帮助!

4

1 回答 1

22

这是一个与您使用的 Xcode 版本没有直接关系的 OS X 问题。Apple 的官方说法是,从未正式支持删除 plist 文件以删除首选项,并且在最近的 OS X 版本中,由于首选项存储方式的变化,它是不可靠的。

支持删除首选项的方法是defaults在终端使用命令,例如:

defaults delete application.bundle.identifier

defaults命令还可以删除/更改首选项中的单个设置。有关完整的详细信息,请参阅man defaults

于 2013-10-21T01:21:20.983 回答