10

我已经安装了 Mac OSX Mavericks(10.9) 的 Pre-Release 版本。我的应用程序包含

  NSUserDefaults *preferences = [[NSUserDefaults standardUserDefaults] retain];
    [preferences setInteger:[_lblSetValue integerValue] forKey:@"execute"];
[defaults synchronize];

作为 NSUserDefauls 将其值存储在 Plist 文件中的 Library -> Preferences -> appbundlename.plist .. 如果我更改了 Plist 文件中的值.. 并再次启动应用程序并通过以下方式访问该值:

id abc = [preferences valueForKey:@"execute"];

然后它给了我以前的值而不是最终更改的值。当我在 Plist 文件中再次检查时,更改值被保存。

例子:

就像最初我为键执行设置了值 1234,然后停止应用程序并将 Plist 文件中的值更改为 Path Library -> Preferences -> appbundlename.plist 为 1000,然后再次启动应用程序并通过以下方式访问其值

 id abc = [preferences valueForKey:@"execute"];

它给了我 1234 而不是 1000。然后.. 问题是.. 如果 valueForKey 方法未获取更改的值,则从哪里访问该值。?

我需要获取 Plist 的更改值。因为它在里脊肉/山里脊肉中给了我正确的价值,但在小牛队中却没有。

请帮忙。

4

5 回答 5

12

我解决此问题的方法是在更改 .plist 文件后终止“cfprefsd”守护进程:

ps auwx | grep cfprefsd | grep -v grep | awk '{打印 $2}' | xargs 须藤杀 -9

下一次访问 .plist 文件后,守护程序将重新启动,然后将具有已更改键的新值。

不幸的是,这种解决方法是必要的,但至少它可以可靠地工作。

于 2013-11-07T18:16:34.850 回答
5

这让我觉得我在使用一个完全不同的操作系统(即不是苹果)。

可能发生的事情是小牛队改变了用户默认值的存储方式。所以,如果你去删除 plist 文件,你会弄乱该应用程序的用户默认设置。

删除容器(包含您的 plist 文件)的正确方法是使用终端中的“默认值”。我还没有检查过使用“默认值”简单地删除是否会正常工作。

为了“解决”我的问题,我不得不(gulp)重新启动 Mavericks。这将清除 NSUserDefaults 缓存,只有这样,NSUserDefaults 才能正常运行。注意:我读过注销/登录也可以工作。

希望有帮助。凯文

于 2013-12-10T21:32:24.910 回答
4

在 Mavericks 应用程序具有容器,设置存储在那里,OSX 将首选项从应用程序的容器复制到~/Library/Preferences/com.example.myapp.plist如果它没有找到。

但是您的问题是优先级将始终转到.plist应用程序容器中的文件,最终~/Library/Preferences/*.plist将被忽略或覆盖。

正确地做事总是使用终端工具defaults

打开你的终端,试试这个:

defaults read com.example.myapp

它会射出正确的默认值,该工具还用于编辑和创建 plist 文件,您可以

defaults usage

了解它是如何工作的。

如果您仍然对应用容器的位置感到好奇,请CD进入:

~/Library/Containers/com.example.myapp/Data/Library/Preferences/

你会在那里找到它,但你真的不需要手动编辑它,并且永远记住它会覆盖/获得优先于~/Library/Preferences.

您可以在我的博文中了解更多相关信息

于 2013-11-04T09:47:16.007 回答
2

不确定它是否仍然对任何人感兴趣,但在终端中运行killall -SIGTERM cfprefsd帮助我解决了这个问题。(不确定遇到“首选项不保存”问题的客户是否必须这样做)..这里有一些苹果开发论坛链接来支持我的主张:)

https://devforums.apple.com/message/909771#909771

https://devforums.apple.com/message/906841#906841

希望能帮助到你。

于 2013-10-25T11:01:33.870 回答
0

你是[defaults synchronize];在设置密钥后打电话吗

通常,偏好会在适当的时候为您保留,但如果您正在设置它然后在不久之后访问它,您可能需要执行此操作以强制保存。

但是,如果您这样做得那么快,我开始怀疑您是否正在使用它来保存偏好。如果您这样做是为了在程序中传递状态,那么使用 NSUserDefaults 有更好的方法。

于 2013-09-10T14:27:56.933 回答