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.