滚动通过UITableView导致exception和崩溃只在iPhone 5C

当用户滚动我的UITableView太快或点击状态栏跳转到表的顶部时,会引发exception。 我只在iPhone 5C设备上看到这个崩溃。 我不能在4S,5或32位模拟器上重现它。

使用“所有exception”断点,我能够打印出所有的后退,我可以通过崩溃增加帧指针。 因为我的应用程序在回溯(除了main)之外没有任何痕迹,所以我认为这是一个Apple bug,与[NSRLEArray objectAtIndex:effectiveRange:] 。 这个问题的作者似乎有与OS X应用程序相同的问题,并build议看看我的应用程序中的NSAttributedString用法。 我在表格视图单元格中使用NSAttributedStrings来超链接UITextView某些string。 但是,如果这是NSAttributedString一个普遍问题,这是否也会导致其他iOS设备崩溃?

回溯:

 (lldb) bt * thread #1: tid = 0x2e57bd, 0x3978e6a0 libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x3978e6a0 libobjc.A.dylib`objc_exception_throw frame #1: 0x2f431dc4 CoreFoundation`+[NSException raise:format:] + 112 frame #2: 0x2fd55230 Foundation`-[NSRLEArray objectAtIndex:effectiveRange:] + 120 frame #3: 0x2fd71d76 Foundation`-[NSConcreteMutableAttributedString addAttribute:value:range:] + 198 frame #4: 0x36d7b278 UIFoundation`__50-[NSConcreteTextStorage addAttribute:value:range:]_block_invoke + 156 frame #5: 0x36d7b102 UIFoundation`-[NSConcreteTextStorage addAttribute:value:range:] + 170 frame #6: 0x337fc02e DataDetectorsUI`-[DDTextKitOperation _addResultsToAttributes] + 266 frame #7: 0x337fc1d6 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke_2 + 26 frame #8: 0x36d79a5e UIFoundation`-[NSTextStorage(ActorSupport) coordinateAccess:] + 34 frame #9: 0x337fc1b8 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke + 116 frame #10: 0x39c78bde libdispatch.dylib`_dispatch_barrier_sync_f_slow_invoke + 66 frame #11: 0x39c730ae libdispatch.dylib`_dispatch_client_callout + 22 frame #12: 0x39c759a8 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 268 frame #13: 0x2f3fc5b0 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8 frame #14: 0x2f3fae7c CoreFoundation`__CFRunLoopRun + 1308 frame #15: 0x2f365470 CoreFoundation`CFRunLoopRunSpecific + 524 frame #16: 0x2f365252 CoreFoundation`CFRunLoopRunInMode + 106 frame #17: 0x3409f2ea GraphicsServices`GSEventRunModal + 138 frame #18: 0x31c1a844 UIKit`UIApplicationMain + 1136 * frame #19: 0x000bffb4 [AppName]`main(argc=1, argv=0x27d4ecec) + 116 at main.m:16 (lldb) bt * thread #1: tid = 0x2e57bd, 0x39153994 libc++abi.dylib`__cxa_throw, queue = 'com.apple.main-thread', stop reason = breakpoint 1.2 frame #0: 0x39153994 libc++abi.dylib`__cxa_throw frame #1: 0x3978e79a libobjc.A.dylib`objc_exception_throw + 250 frame #2: 0x2f431dc4 CoreFoundation`+[NSException raise:format:] + 112 frame #3: 0x2fd55230 Foundation`-[NSRLEArray objectAtIndex:effectiveRange:] + 120 frame #4: 0x2fd71d76 Foundation`-[NSConcreteMutableAttributedString addAttribute:value:range:] + 198 frame #5: 0x36d7b278 UIFoundation`__50-[NSConcreteTextStorage addAttribute:value:range:]_block_invoke + 156 frame #6: 0x36d7b102 UIFoundation`-[NSConcreteTextStorage addAttribute:value:range:] + 170 frame #7: 0x337fc02e DataDetectorsUI`-[DDTextKitOperation _addResultsToAttributes] + 266 frame #8: 0x337fc1d6 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke_2 + 26 frame #9: 0x36d79a5e UIFoundation`-[NSTextStorage(ActorSupport) coordinateAccess:] + 34 frame #10: 0x337fc1b8 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke + 116 frame #11: 0x39c78bde libdispatch.dylib`_dispatch_barrier_sync_f_slow_invoke + 66 frame #12: 0x39c730ae libdispatch.dylib`_dispatch_client_callout + 22 frame #13: 0x39c759a8 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 268 frame #14: 0x2f3fc5b0 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8 frame #15: 0x2f3fae7c CoreFoundation`__CFRunLoopRun + 1308 frame #16: 0x2f365470 CoreFoundation`CFRunLoopRunSpecific + 524 frame #17: 0x2f365252 CoreFoundation`CFRunLoopRunInMode + 106 frame #18: 0x3409f2ea GraphicsServices`GSEventRunModal + 138 frame #19: 0x31c1a844 UIKit`UIApplicationMain + 1136 * frame #20: 0x000bffb4 [AppName]`main(argc=1, argv=0x27d4ecec) + 116 at main.m:16 (lldb) bt * thread #1: tid = 0x2e57bd, 0x3978e6a0 libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x3978e6a0 libobjc.A.dylib`objc_exception_throw frame #1: 0x2f431b88 CoreFoundation`-[NSException raise] + 8 frame #2: 0x36d7b19a UIFoundation`-[NSConcreteTextStorage addAttribute:value:range:] + 322 frame #3: 0x337fc02e DataDetectorsUI`-[DDTextKitOperation _addResultsToAttributes] + 266 frame #4: 0x337fc1d6 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke_2 + 26 frame #5: 0x36d79a5e UIFoundation`-[NSTextStorage(ActorSupport) coordinateAccess:] + 34 frame #6: 0x337fc1b8 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke + 116 frame #7: 0x39c78bde libdispatch.dylib`_dispatch_barrier_sync_f_slow_invoke + 66 frame #8: 0x39c730ae libdispatch.dylib`_dispatch_client_callout + 22 frame #9: 0x39c759a8 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 268 frame #10: 0x2f3fc5b0 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8 frame #11: 0x2f3fae7c CoreFoundation`__CFRunLoopRun + 1308 frame #12: 0x2f365470 CoreFoundation`CFRunLoopRunSpecific + 524 frame #13: 0x2f365252 CoreFoundation`CFRunLoopRunInMode + 106 frame #14: 0x3409f2ea GraphicsServices`GSEventRunModal + 138 frame #15: 0x31c1a844 UIKit`UIApplicationMain + 1136 * frame #16: 0x000bffb4 [AppName]`main(argc=1, argv=0x27d4ecec) + 116 at main.m:16 (lldb) bt * thread #1: tid = 0x2e57bd, 0x39153994 libc++abi.dylib`__cxa_throw, queue = 'com.apple.main-thread', stop reason = breakpoint 1.2 frame #0: 0x39153994 libc++abi.dylib`__cxa_throw frame #1: 0x3978e79a libobjc.A.dylib`objc_exception_throw + 250 frame #2: 0x2f431b88 CoreFoundation`-[NSException raise] + 8 frame #3: 0x36d7b19a UIFoundation`-[NSConcreteTextStorage addAttribute:value:range:] + 322 frame #4: 0x337fc02e DataDetectorsUI`-[DDTextKitOperation _addResultsToAttributes] + 266 frame #5: 0x337fc1d6 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke_2 + 26 frame #6: 0x36d79a5e UIFoundation`-[NSTextStorage(ActorSupport) coordinateAccess:] + 34 frame #7: 0x337fc1b8 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke + 116 frame #8: 0x39c78bde libdispatch.dylib`_dispatch_barrier_sync_f_slow_invoke + 66 frame #9: 0x39c730ae libdispatch.dylib`_dispatch_client_callout + 22 frame #10: 0x39c759a8 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 268 frame #11: 0x2f3fc5b0 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8 frame #12: 0x2f3fae7c CoreFoundation`__CFRunLoopRun + 1308 frame #13: 0x2f365470 CoreFoundation`CFRunLoopRunSpecific + 524 frame #14: 0x2f365252 CoreFoundation`CFRunLoopRunInMode + 106 frame #15: 0x3409f2ea GraphicsServices`GSEventRunModal + 138 frame #16: 0x31c1a844 UIKit`UIApplicationMain + 1136 * frame #17: 0x000bffb4 [AppName]`main(argc=1, argv=0x27d4ecec) + 116 at main.m:16 (lldb) bt * thread #1: tid = 0x2e57bd, 0x39d3e1fc libsystem_kernel.dylib`__pthread_kill + 8, queue = 'com.apple.main-thread', stop reason = signal SIGABRT frame #0: 0x39d3e1fc libsystem_kernel.dylib`__pthread_kill + 8 frame #1: 0x39da5a52 libsystem_pthread.dylib`pthread_kill + 58 frame #2: 0x39cef02c libsystem_c.dylib`abort + 76 frame #3: 0x001f32ba [AppName]`uncaught_exception_handler + 26 frame #4: 0x2f432184 CoreFoundation`__handleUncaughtException + 580 frame #5: 0x3978e926 libobjc.A.dylib`_objc_terminate() + 174 frame #6: 0x391541b2 libc++abi.dylib`std::__terminate(void (*)()) + 78 frame #7: 0x39153d16 libc++abi.dylib`__cxa_rethrow + 102 frame #8: 0x3978e80e libobjc.A.dylib`objc_exception_rethrow + 42 frame #9: 0x36d7b150 UIFoundation`-[NSConcreteTextStorage addAttribute:value:range:] + 248 frame #10: 0x337fc02e DataDetectorsUI`-[DDTextKitOperation _addResultsToAttributes] + 266 frame #11: 0x337fc1d6 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke_2 + 26 frame #12: 0x36d79a5e UIFoundation`-[NSTextStorage(ActorSupport) coordinateAccess:] + 34 frame #13: 0x337fc1b8 DataDetectorsUI`__46-[DDTextKitOperation doURLificationOnDocument]_block_invoke + 116 frame #14: 0x39c78bde libdispatch.dylib`_dispatch_barrier_sync_f_slow_invoke + 66 frame #15: 0x39c730ae libdispatch.dylib`_dispatch_client_callout + 22 frame #16: 0x39c759a8 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 268 frame #17: 0x2f3fc5b0 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8 frame #18: 0x2f3fae7c CoreFoundation`__CFRunLoopRun + 1308 frame #19: 0x2f365470 CoreFoundation`CFRunLoopRunSpecific + 524 frame #20: 0x2f365252 CoreFoundation`CFRunLoopRunInMode + 106 frame #21: 0x3409f2ea GraphicsServices`GSEventRunModal + 138 frame #22: 0x31c1a844 UIKit`UIApplicationMain + 1136 * frame #23: 0x000bffb4 [AppName]`main(argc=1, argv=0x27d4ecec) + 116 at main.m:16 (lldb) bt * thread #22: tid = 0x2e57ea, 0x39da2cbc libsystem_pthread.dylib`start_wqthread, stop reason = signal SIGABRT * frame #0: 0x39da2cbc libsystem_pthread.dylib`start_wqthread 

这里是我设置属性string的地方:

 // earlier in the code tweetTextView.attributedText = [[NSAttributedString alloc] initWithString:tweetTextView.text]; ... -(void)findHashtagsAndAtMentionsInTweetText:(UITextView *)textView { NSString *tweetText = textView.text; NSError *error = nil; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(@(\\w+))|(^|\\W)(#|\\uFF03)(\\w*\\p{L}\\w*)" options:0 error:&error]; NSArray *matches = [regex matchesInString:tweetText options:0 range:NSMakeRange(0, tweetText.length)]; NSMutableAttributedString * myTagOrMention = [[NSMutableAttributedString alloc] initWithString:tweetTextView.text]; for (NSTextCheckingResult *match in matches) { NSRange wordRange = [match rangeAtIndex:0]; // causing crash? NSString* word = [tweetText substringWithRange:wordRange]; if([word rangeOfString:@"@"].location != NSNotFound) { // @ mention // remove whitespaces and @ NSString *formattedTag = [NSString stringWithFormat:@"%@", [[word stringByReplacingOccurrencesOfString:@" " withString:@""] stringByReplacingOccurrencesOfString:@"@" withString:@""]]; NSString *tweetContets = tweetTextView.text; NSRange range = [tweetContets rangeOfString:word]; if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"twitter://"]]) { NSString *twitterAppURL = [NSString stringWithFormat:@"%@%@", @"twitter://user?screen_name=",formattedTag]; [myTagOrMention addAttribute:NSLinkAttributeName value:twitterAppURL range:range]; } else { [myTagOrMention addAttribute:NSLinkAttributeName value:[NSString stringWithFormat:@"%@%@", @"http://mobile.twitter.com/",formattedTag] range:range]; } tweetTextView.attributedText = myTagOrMention; } else { // hashtag // remove whitespaces and pound NSString *formattedTag = [NSString stringWithFormat:@"%@", [[word stringByReplacingOccurrencesOfString:@" " withString:@""] stringByReplacingOccurrencesOfString:@"#" withString:@""]]; NSString *tweetContets = tweetTextView.text; NSRange range = [tweetContets rangeOfString:word]; [myTagOrMention addAttribute:NSLinkAttributeName value:[NSString stringWithFormat:@"%@%@%@%@", @"http://twitter.com/search/", @"?q=%23", formattedTag, @"&s=hash"] range:range]; tweetTextView.attributedText = myTagOrMention; } } 

该错误不在您发布的代码中。 当一个UITextView被重用,同时它的链接仍然在生成,这是asynchronous完成的。

看到这些类似的堆栈溢出问题:

  • UITableView中的iOS 7 UITextView链接检测崩溃
  • UITextViews在UITableView链接检测错误在iOS 7
  • iOS 7中的UITextView链接检测

许多用户报告说,在单元格的prepareForReuse方法中将text视图的text属性设置为nil可以解决问题。 或者,您可以使用类似TTTAttributedLabel的库而不是文本视图。

它只出现在iPhone 5C的事实可能是一个红鲱鱼 。 我敢打赌,这款设备仍在运行iOS 7,其他设备已经升级到更新版本的iOS。


在附注中,可能存在你的正则expression式不包含的边缘情况。 我会删除你的Twitterparsing方法,并用正式的twitter-text-objc库replace它。