NSUserDefaults和查询在Mavericks Mac OSX 10.9中不起作用

时间:2013-09-10 14:23:37

标签: ios macos osx-mavericks

我已经安装了Mac OSX Mavericks的预发布版本(10.9)。我的申请包含

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

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

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

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

示例:

与最初类似,我为键执行设置了值1234,然后停止应用程序并更改了Plist文件中的值路径库 - >偏好 - > appbundlename.plist为1000,再次启动应用程序并通过

访问其值
 id abc = [preferences valueForKey:@"execute"];

它给了我1234而不是1000.然后..问题是...... 如果方法valueForKey未采用更改的值,则从中访问值。?

我需要获取Plist的更改值。因为它在Loin / Mountain Loin中给我正确的价值但在小牛队中没有。

请帮忙。

5 个答案:

答案 0 :(得分:12)

我解决这个问题的方法是在更改.plist文件后终止'cfprefsd'守护程序进程:

  

ps auwx | grep cfprefsd | grep -v grep | awk'{print $ 2}'| xargs sudo kill -9

在下次访问.plist文件后,守护进程将重新启动,然后将为已更改的密钥设置新值。

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

答案 1 :(得分:5)

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

可能发生的事情是Mavericks改变了用户默认存储的方式。因此,如果你去删除plist文件,你将搞乱该应用程序的用户默认值。

删除容器(包含plist文件)的正确方法是使用Terminal中的“defaults”。我没有检查过使用'defaults'简单删除是否能正常工作。

要“修复”我的问题,我必须(gulp)重启小牛。这将清除NSUserDefaults缓存,只有这样,NSUserDefaults才能正常运行。注意:我已经读过注销/登录也可以。

希望有所帮助。 凯文

答案 2 :(得分:4)

On 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中的plist。

您可以在我的blog post

中详细了解相关信息

答案 3 :(得分:2)

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

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

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

希望它有所帮助。

答案 4 :(得分:0)

设置密钥后是否正在调用[defaults synchronize];

通常情况下,优惠会在适当的时候保留给您,但如果您正在设置它,然后在您需要执行此操作后立即访问它以强制保存。

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