我已经安装了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中给我正确的价值但在小牛队中没有。
请帮忙。
答案 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。