使用NSString方法进行神秘崩溃rangeOfComposedCharacterSequenceAtIndex:

时间:2013-11-18 16:12:11

标签: ios objective-c cocoa-touch nsstring

我的应用使用了多个UITextView,我们收到了用户无法重现的崩溃报告。

崩溃报告没有(似乎)包含我们的任何代码,并且NSInvalidArgumentException方法NSString中的rangeOfComposedCharacterSequenceAtIndex:崩溃了,我们没有直接调用代码,但似乎是由框架调用。

以下是崩溃报告:

0  CoreFoundation    __exceptionPreprocess + 130
1 libobjc.A.dylib    objc_exception_throw + 38
2  CoreFoundation    -[NSException initWithCoder:]
3  Foundation        -[NSString rangeOfComposedCharacterSequenceAtIndex:] + 88
4  UIKit             __74-[UITextInputController _validCaretPositionFromCharacterIndex:downstream:]_block_invoke + 328
5  UIFoundation      -[NSTextStorage coordinateReading:] + 36
6  UIKit             -[UITextInputController _validCaretPositionFromCharacterIndex:downstream:] + 218
7  UIKit             __52-[UITextInputController _characterPositionForPoint:]_block_invoke + 1112
8  UIFoundation      -[NSLayoutManager(TextLocking) coordinateAccess:] + 46
9  UIKit             -[UITextInputController _characterPositionForPoint:] + 224
10 UIKit             -[UITextSelection setSelectionWithFirstPoint:secondPoint:] + 56
11 UIKit             -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) twoFingerRangedSelectGesture:] + 386
12 UIKit             _UIGestureRecognizerSendActions + 196
13 UIKit             -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 1138
14 UIKit             ___UIGestureRecognizerUpdate_block_invoke + 48
15 UIKit             _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 218
16 UIKit             _UIGestureRecognizerUpdate + 282
17 CoreFoundation    __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
18 CoreFoundation    __CFRunLoopDoObservers + 284
19 CoreFoundation    __CFRunLoopRun + 730
20 CoreFoundation    CFRunLoopRunSpecific + 522
21 CoreFoundation    CFRunLoopRunInMode + 106
22 GraphicsServices  GSEventRunModal + 138
23 UIKit             UIApplicationMain + 1136
24 main.m line 16 
25 libdyld.dylib     start + 2

https://gist.github.com/timarnold/6981caa6a1ee2b98c2fe

由于我不确切知道代码的哪一部分导致崩溃,我不确定哪些示例代码对发布有帮助。我更感兴趣的是,如果有人看到过这样的事情,或者可能会建议在何处或如何进一步调查此事。

2013-11-21更新

通过执行以下操作,我能够重现此问题:

  • 向我的UITextView添加一些文字,包括一个尾随的换行符(\n
  • 让我的应用强制UITextView重新启动第一响应者状态
  • 让我的应用为我的UITextView分配第一响应者状态,然后点击将光标插入字符串的末尾(换行符的位置周围)

之后应用程序崩溃了上述报告。

我试图在一个只有股票UITextView的空Xcode项目中创建它而没有别的,并且无法这样做。似乎我的应用程序中发生了一些与UITextView密谋的事情,导致此次崩溃。很想知道什么,但是这个问题在我的项目中得到了解决(因为我们对追踪换行符并不感兴趣,可以修剪它们,从而防止崩溃发生)。

如果有人可以在示例项目中重现这一点,如果这确实是UITextView的错误,那么提交雷达会很棒。

感谢@ wattson12和@Johan Kool提供的解决方案。

2 个答案:

答案 0 :(得分:4)

我今天遇到了同样的问题,我没有旧的设备,但是看看这是不同的< 7.0.3因为它现在非常可重复并且之前没有被拾取。我无法解释原因,但这是我注意到的和我使用的修复:

我看到点击文字视图时崩溃:

  • 我在文字末尾有一个新的字符,
  • 我点击了当前文字之外的某个地方

我的解决方法是从最后修剪换行符(我使用了while循环以避免删除任何前导换行符,但如果不是问题,stringByTrimmingCharactersInSet会没问题)

答案 1 :(得分:1)

将scrollEnabled设置为YES(默认值)为我们修复了崩溃。 对于UI,我们需要scrollEnabled为NO。但是,一个次优的UI比崩溃更好,因此这种类别方法仅适用于低于7.1的iOS版本

- (void)enableScrollIfBuggyOSVersion {
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7.1" options:NSNumericSearch] == NSOrderedAscending) {
        [self setScrollEnabled:YES];
    } else {
        [self setScrollEnabled:NO];
    }
}