NSUserDefaults и запрос не работают в Mavericks Mac OSX 10.9

Я установил предварительную версию Mac OSX Mavericks (10.9). В моем приложении содержится

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

Как NSUserDefauls Сохраните его значение в файле Plist в Library → Preferences → appbundlename.plist.. Если я изменил значение в Plist File.. и снова запустил приложение и получил доступ к значению:

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

то он дает мне предыдущее значение, а не окончательно измененное значение. Когда я снова проведу его в файле Plist, значение изменений будет сохранено.

Пример:

Как и раньше, я установил значение 1234 для выполнения ключа, а затем остановил приложение и изменил значение в файле Plist на нем в Библиотеке путей → Настройки → appbundlename.plist до 1000 и снова запустил приложение и получил доступ к его значение

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

это дает мне 1234 не 1000. Тогда.. Вопрос... Откуда доступно значение, если измененное значение не принимается методом valueForKey.?

Мне нужно получить измененное значение Plist. Поскольку это дает мне правильное значение в Loin/Mountain Loin, но не в mavericks.

Пожалуйста, помогите.

Ответ 1

Моя работа для этой проблемы заключается в том, чтобы убить процессы демона cfprefsd после внесения изменений в файл .plist:

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

Демон будет перезапущен после следующего доступа к файлу .plist и затем будет иметь новое значение для ключа, который был изменен.

К сожалению, эта работа необходима, но, по крайней мере, она работает надежно.

Ответ 2

Это заставило меня почувствовать, что я использую совершенно другую ОС (а не Apple).

Что может случиться, так это то, что Mavericks изменил способ сохранения пользовательских значений по умолчанию. Итак, если вы идете и удаляете файл plist, вы испортите пользовательские значения по умолчанию для этого приложения.

Правильный способ удаления контейнера (содержащего ваш файл plist) - использовать "умолчания" из терминала. Я не проверял, будет ли просто удаляться использование "по умолчанию". [/P >

Чтобы "исправить" мою проблему, мне пришлось (gulp) перезагрузить Mavericks. Это очистит кэш NSUserDefaults, и только тогда NSUserDefaults будет работать правильно. Примечание. Я прочитал, что также может работать logout/login.

Надеюсь, что это поможет. Кевин

Ответ 3

В приложениях 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/

Вы найдете его там, но вам не нужно редактировать это вручную и всегда помните, что он перезапишет/получит приоритет над plist в ~/Library/Preferences.

вы можете больше узнать об этом в своем сообщении .

Ответ 4

Не уверен, что он все еще интересует кого-либо, но запуск killall -SIGTERM cfprefsd в Терминале помог мне решить проблему. (не уверены, что клиенты, испытывающие проблему с "не сохранением предпочтений", должны сделать то же самое). Вот некоторые ссылки на форум разработчиков apple dev для поддержки моего заявления:)

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

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

Надеюсь, что это поможет.

Ответ 5

Вы вызываете [defaults synchronize]; после установки клавиши

Как правило, предпочтения сохраняются для вас в подходящее время, но если вы его настроите, а затем получите доступ к нему вскоре после того, как вам понадобится сделать это, чтобы принудительно сохранить.

Но если вы делаете это так быстро, я начинаю сомневаться, что вы используете его, чтобы сохранить предпочтение. Если вы делаете это, чтобы передать состояние вокруг своей программы, тогда есть лучшие способы использования NSUserDefaults.