Objective c 删除plist文件不会重置macOS 10.9上的应用程序+

Objective c 删除plist文件不会重置macOS 10.9上的应用程序+,objective-c,macos,cocoa,plist,Objective C,Macos,Cocoa,Plist,在10.9上开发Cocoa应用程序时,我注意到,如果我转到~/Library/Preferences并删除我的应用程序的plist文件以重置它,那么在下一次构建和运行时,该应用程序的行为就好像从来没有删除过plist文件一样 我花了很长时间才找到发生这种情况的原因,但我没有看到关于它的问题/答案,所以我自己写这个问题并回答它以帮助其他人。在10.9上,系统正在对首选项进行更强大的缓存。删除plist文件后,我启动活动监视器并强制终止cfprefsd进程。小心:有多个同名进程正在运行,您只想杀死在

在10.9上开发Cocoa应用程序时,我注意到,如果我转到~/Library/Preferences并删除我的应用程序的plist文件以重置它,那么在下一次构建和运行时,该应用程序的行为就好像从来没有删除过plist文件一样


我花了很长时间才找到发生这种情况的原因,但我没有看到关于它的问题/答案,所以我自己写这个问题并回答它以帮助其他人。

在10.9上,系统正在对首选项进行更强大的缓存。删除plist文件后,我启动活动监视器并强制终止cfprefsd进程。小心:有多个同名进程正在运行,您只想杀死在您自己的用户下运行的进程;不要杀死以root身份运行的用户

这样做似乎会刷新首选项缓存,在下一次运行我的应用程序时,我会从零开始启动


编辑:如下所述,在命令行中使用defaults delete[您的包标识符]似乎也可以消除缓存问题。我在这方面取得了一些成功。

顺便说一句,我刚刚发布了一个GUI应用程序,它可能比使用默认命令更方便:

它的工作原理与Xcode的plist编辑器几乎相同,但直接影响用户的应用程序首选项

要删除所有pref,您可以在我的pref编辑器中打开pref,选择all,然后使用Backspace或delete键删除它们,它们会立即全部消失


但是,对于这个特定的任务,使用默认的delete可能会更快,特别是如果您将命令放入以.command结尾的文本文件中,并使用chmod+x使其可执行。然后,您可以在Finder中双击它以执行它。

我发现,终止用户进程cfprefsd将重新刷新缓存,因此您的更改将被保留

killall-终端中的u$USER cfprefsd


默认删除com.somecompany.someapp

您可以使用“默认删除”以缓存友好的方式删除首选项。默认删除仅在首选项系统正常工作时才起作用:如果不起作用,请提交一个错误,这是不期望的。shon-您是Apple的吗?我可以向你保证,我没有参与这个过程。我用Finder删除了我的应用程序的plist文件,然后浪费了一个小时的时间试图弄清楚为什么OSX没有运行。删除查找器中的plist应该清除缓存的版本。这并不是对苹果的疏忽。当用户删除该文件时,其意图是什么就一目了然了:取消app X的prefs。问题是,互联网上大约有4549312个网页向用户解释如何修复行为不端的应用程序。第一步总是:转到~/Library/Preferences并删除应用程序的首选项文件。这显然不再适用于小牛队;您现在必须告诉用户通过终端并使用“默认删除”。就我而言,这是一个错误。cfprefsd应该先检查磁盘上的plist是否较新或已删除,然后再盲目使用其缓存副本。如果您更喜欢使用CLI,我刚刚尝试关闭所有cfprefsd,它似乎也能正常工作。仍然是早期。有可能有一些新命令使plist替换变得更容易。如果没有的话,我想会有很多AppleCare员工要求苹果工程部添加一个。尽管它看起来可能会工作,但我认为这并不安全,因为它可能会破坏最近设置的其他应用程序。因此被否决了。哦,对不起,我现在才意识到你写的是kill确实会刷新它的缓存。这意味着进程不会被强制终止,而是被要求发出退出信号,允许它在退出之前执行刷新操作。在那种情况下,我的否决票是没有道理的。除非您更新您的答案,否则我无法撤销它。Thomas的担心是有效的,但是“默认删除”对我不起作用,我的用例是从备份中手动替换plist。我认为如果你知道自己在做什么,风险是可控的。一个简单的解决方案:重启电脑。现在删除plist文件。现在构建并运行,您将从干净的pref开始。原因:pref被同步到内存中,并从内存中恢复,除非您首先清除内存,这是重启所做的。好的,是的,这会做到。但是在每次生成和运行之间重新启动计算机并不是一个切实可行的解决方案。没有人建议在每次生成和运行之前重新启动计算机-只有在需要删除plist文件以重置它的特殊情况下。这是一个严重的问题,因为您正在与系统对抗,该系统保留plist文件的秘密缓存,并在您删除该文件时将其恢复。这是有效的。。。大多数时候。在使用这个终端命令后,我仍然有一些实例无法让应用程序干净地启动。效果很好!!用于读取和写入值的事件!比任何一个plist编辑都好这是一个很棒的小东西 这是一个很好的调试工具。谢谢分享!