方法Swizzle崩溃:越南键盘失败和崩溃

时间:2011-10-05 22:13:39

标签: swizzling

编辑:将问题加上“Method 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:replacementString:时,收到的字符串是有效的。

一切似乎表明这是一个Apple问题,但我发现没有其他关于此问题的在线报道。我的直觉说这是我的代码中的东西。任何人都可以提示吗?

1 个答案:

答案 0 :(得分:0)

在使用方法调配时,此答案中的信息对于遇到类似问题的人最有用。有关方法调配的解释,请转到here

我调整了pathForResource:ofType:在NSBundle中,我自己的方法搜索我的应用程序加载的每个包。它还会搜索我随应用程序附带的资源档案。现在出现问题:键盘通常从iOS内部专用的包中访问数据。我的混合方法无法访问这些,因此键盘会间歇性地失败,并且没有给出有关原因的有用信息。

要解决它,我改变了swizzled方法,以便在我的应用程序的方法找不到任何资源的情况下调用[NSBundle pathForResource:ofType:]的原始实现。

问题解决了。