Метод Swizzle Crash: сбой и сбой вьетнамской клавиатуры - PullRequest
0 голосов
/ 06 октября 2011

РЕДАКТИРОВАТЬ: префикс вопроса с «Метод Swizzle Crash», чтобы помочь другим найти ошибку.

Для каждой клавиши, нажатой на вьетнамской клавиатуре на симуляторе или любом устройстве под управлением iOS 4 или выше, следующее сообщениевыводит на консоль, и первый респондент не отправляет ни одного символа:

Can't find transliterator file: vi_TelexTransliterator
utrans_transUChars error U_ILLEGAL_ARGUMENT_ERROR

Нет экземпляров этих строк или подстрок в моем коде сервера или клиента.Это происходит из API.

Симуляторы и устройства под управлением iOS 4 будут последовательно вылетать при втором нажатии клавиши.В iOS 5 не происходит сбоев. Ошибка в верхней части стека вызовов выглядит следующим образом:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFString substringToIndex:]: Range or index out of bounds'

Стеки вызовов выглядят так:

Foundation       -[NSString substringToIndex:]
TextInput        -[TIKeyboardInputManagerZephyr internalIndexToExternal:]
TextInput        -[TIKeyboardInputManagerZephyr inputCount]
UIKit            -[UIKeyboardImpl addInputString:fromVariantKey:]
UIKit            -[UIKeyboardImpl handleStringInput:fromVariantKey:]
UIKit            -[UIKeyboardImpl handleKeyEvent:]
UIKit            -[UIApplication _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIResponder(Internal) _handleKeyEvent:]
UIKit            -[UIApplication handleKeyEvent:]
UIKit            -[UIKeyboardLayoutStar sendStringAction:forKey:]
UIKit            -[UIKeyboardLayoutStar touchUp:]
UIKit            -[UIKeyboardLayout touchesEnded:withEvent:]
UIKit            -[UIWindow _sendTouchesForEvent:]
UIKit            -[UIWindow sendEvent:]
UIKit            -[UIApplication sendEvent:]
UIKit            _UIApplicationHandleEvent
GraphicsServices PurpleEventCallback
CoreFoundation   __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
CoreFoundation   __CFRunLoopDoSource1
CoreFoundation   __CFRunLoopRun
CoreFoundation   CFRunLoopRunSpecific
CoreFoundation   CFRunLoopRunInMode
GraphicsServices GSEventRunModal
GraphicsServices GSEventRun
UIKit            -[UIApplication _run]
UIKit            UIApplicationMain
APP              main (main.m:XXX)

Я пробовалэта клавиатура в разных местах по всему приложению, в том числе на экране безопасности перед загрузкой основного представления и со всеми нашими методами обработки ввода, закомментированными в его делегате.Отказ последовательный.Когда методы делегата реализованы, и я перехожу через textField: shouldChangeCharactersInRange: replaceString:, полученная строка действительна.

Кажется, все указывает на то, что это проблема Apple, но я не нахожу других отчетов овыпуск онлайн.Моя интуиция говорит, что это что-то в моем коде.Кто-нибудь может намекнуть?

1 Ответ

0 голосов
/ 28 октября 2011

Информация в этом ответе будет наиболее полезна тем, кто испытывает похожие проблемы при использовании метода Swizzling. Для объяснения метода swizzling, перейдите здесь .

Я просмотрел pathForResource: ofType: в NSBundle для моего собственного метода, который ищет все пакеты, загруженные моим приложением. Он также ищет архивы ресурсов, которые я отправил вместе с моим приложением. Теперь о проблеме: клавиатуры обычно получают доступ к данным из пакетов, которые являются частными для внутренних устройств iOS. Мой метод Swizzled не имел доступа к ним, поэтому клавиатура периодически выходила из строя и не давала мне никакой полезной информации о том, почему.

Чтобы решить эту проблему, я изменил метод swizzled, чтобы он вызывал оригинальную реализацию [NSBundle pathForResource: ofType:], если метод моего приложения не может найти ресурс.

Проблема решена.

...