NSUserDefaults standardUserDefaults setObject вылет в defaultsChanged - PullRequest
0 голосов
/ 06 декабря 2011

Я столкнулся с чем-то, чего я не понимаю.Я установил выбор языка для приложения в меню настроек телефона.У меня есть метод делегата

- (void)defaultsChanged:(NSNotification *)notif 

в моем AppDelegate.Я читаю новый параметр выбранного языка и пытаюсь изменить язык с помощью

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];

К сожалению, эта строка всегда дает мне ошибку EXC_BAD_ACCESS.Я не понимаю, почему.

Я пробовал разные способы, указанные в StackOverflow, чтобы изменить локализацию во время выполнения, но они работают только для текстов в приложении.У меня также есть изображения, которые локализованы, и они обновляются только при изменении языка в NSUserDefaults.

Мне нужны некоторые советы здесь.

Спасибо!

1 Ответ

0 голосов
/ 07 декабря 2011

Мне кажется, что вносить изменения в NSUserDefaults внутри обработчика defaultsChanged не очень хорошая идея. Согласно вашему собственному комментарию, это вызывает рекурсию.

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

Возможно, вам нужен другой метод хранения, чем NSUserDefaults для вашего состояния, например, plist. Я знаю, что NSUserDefaults действительно удобно использовать, и это главная причина, по которой люди используют (и иногда неправильно) его для всех видов состояний, которые на самом деле не являются пользовательскими настройками, но это может вызвать проблемы из-за всех наворотов поставляется, например, поддержка NSUserDefaultsDidChangeNotification наблюдателей.

...