РЕДАКТИРОВАТЬ
A Приличный Обход ошибки:
Короткая версия: Просто отложите вызовы, вызывающие ошибку, допользователь не раздражен.
Длинная версия:
Так как я думаю, что проблема исходит от вызова [NSUserDefaults standardUserDefaults]
, который вызывает грязную петлю загрузки списка ПОСЛЕ некоторое действие, запрашивающее раскладки клавиатуры (например, UIAlert
) ...
Я бы посоветовал вызвать [NSUserDefaults standardUserDefaults]
только один раз при загрузке приложения ( ДО любого вызывающего ошибку вызова) и сохраните возвращенную ссылку в одноэлементном классе в течение всего жизненного цикла приложения.Я не думаю, что объем памяти будет огромным ... (я делаю это в нескольких приложениях без каких-либо проблем).В худшем случае загрузка plist * 100 будет выполняться только один раз при загрузке приложения, а не во время игры.
Если проблема возникает из-за вызовов [userDefaults setXxxx:...]
, то же решение, вы можете просто сохранить значения для сохранения в памятиустановите их позже в userDefaults
, как непосредственно перед синхронизацией их ... Но есть риск потери информации, если что-то пойдет не так, как сбой.Лично я предпочитаю sync
после каждого set
для обеспечения целостности данных ...
ENDOFEDIT
Краткий ответ: ошибка iOS4.3,очень мало шансов найти обходной путь ... сообщить об ошибке и дождаться следующего обновления iOS ... WWDC через 2 недели ... 1 ~ 2 месяца.
Длинный:
После просмотрав UIKit asssembly, вот мои догадки:
InputModeProperties.plist
содержит список всех раскладок клавиатуры по локали. UIKit
используйте это для нескольких вещей, например, при отображенииклавиатура, чтобы определить доступные раскладки клавиатуры.(Locales ...) Одна вещь интересна, мы можем найти некоторые из ее информации в NSUserDefaults
:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
==> {
AppleKeyboards = ( // I have two keyboard in preferences
"fr_FR@hw=French;sw=AZERTY", // french first
"en_US@hw=US;sw=QWERTY" // english second
);
...
- Но эта информация не сохраняетсяв настройках приложения, в отличие от вашего счета.(
NSGlobalDomain
, или более вероятно Отдельные домены для каждого из предпочитаемых пользователем языков ) - Поэтому я не удивлюсь, что в UIKit существует конфликт (ошибка)+ NSUserDefaults, вызывающее этот грязный цикл загрузки plist.
- Вы говорите около 100 звонков?Это что-то вроде количества локалей / раскладок в листе!
Когда клавиатура недоступна в NSUserDefaults
... (Как после синхронизации, давайте представим ошибку, делающую это) ... * UIKit
мог бы попробовать все доступные клавиатуры, чтобы определить пользовательскую, неукоснительно анализируя этот список 4.4K сто раз ... Как при отображении UIAlertView
... после NSUSerDefault
синхронизации / изменения.
Кто знает?Ребята из Apple, у которых есть исходный код:)
Я не удивлюсь, если выберу настройку клавиатуры, отличную от США по умолчанию, а затем возврат к США, решит проблему.Бесполезно в вашем случае, но подтвердит проблему.Посмотрите, что для еще одной ошибки 4.3 ...
Как говорили другие, не использование NSUserDefaults, а простой пользовательский список в / Documents может быть (не) достойным решением проблемы.
Отличная работа на TinyКрылья!:)