在UITableview reloadData上报告崩溃

我收到Crashlytics的崩溃报告总是在同一个地方,但我无法复制崩溃。

它似乎只是iOS 9上的用户而且只是非常偶然。 我不确定这是代码问题还是其他问题。 最后一行提到libdispatch.dylib缺失,再次,不确定是否相关。

Crashlytics指示崩溃发生在MMDetailTableVC.m第1407行,即reloadData行。

这是报道的内容:

 Crashed: com.apple.main-thread EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000001 Thread : Crashed: com.apple.main-thread 0 libobjc.A.dylib 0x20f0fae2 objc_msgSend + 1 1 CoreFoundation 0x2168b91b -[NSDictionary descriptionWithLocale:indent:] + 310 2 Foundation 0x21e77e2d _NSDescriptionWithLocaleFunc + 60 3 CoreFoundation 0x217091a3 __CFStringAppendFormatCore + 7986 4 CoreFoundation 0x21707255 _CFStringCreateWithFormatAndArgumentsAux2 + 80 5 CoreFoundation 0x2171f559 _CFLogvEx2 + 96 6 CoreFoundation 0x2171f9af _CFLogvEx3 + 118 7 Foundation 0x21f3f4f7 _NSLogv + 126 8 Foundation 0x21e8679d NSLog + 28 9 UIKit 0x259b45fb -[UITableView reloadData] + 1818 10 Simple Meeting Minutes 0x91fff -[MMDetailTableVC saveItemEntry:] (MMDetailTableVC.m:1407) 11 Simple Meeting Minutes 0xa2edf -[MMItemViewController saveButtonAction:] (MMItemViewController.m:526) 12 UIKit 0x25905771 -[UIApplication sendAction:to:from:forEvent:] + 80 13 UIKit 0x25a86c71 -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 140 14 UIKit 0x25905771 -[UIApplication sendAction:to:from:forEvent:] + 80 15 UIKit 0x25905701 -[UIControl sendAction:to:forEvent:] + 64 16 UIKit 0x258ed61f -[UIControl _sendActionsForEvents:withEvent:] + 446 17 UIKit 0x258ed74b -[UIControl _sendActionsForEvents:withEvent:] + 746 18 UIKit 0x25905051 -[UIControl touchesEnded:withEvent:] + 616 19 UIKit 0x25904cbf -[UIWindow _sendTouchesForEvent:] + 646 20 UIKit 0x258fd5d7 -[UIWindow sendEvent:] + 642 21 UIKit 0x258ce119 -[UIApplication sendEvent:] + 204 22 UIKit 0x258cc757 _UIApplicationHandleEventQueue + 5134 23 CoreFoundation 0x216f9257 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14 24 CoreFoundation 0x216f8e47 __CFRunLoopDoSources0 + 454 25 CoreFoundation 0x216f71af __CFRunLoopRun + 806 26 CoreFoundation 0x21649bb9 CFRunLoopRunSpecific + 516 27 CoreFoundation 0x216499ad CFRunLoopRunInMode + 108 28 GraphicsServices 0x228c3af9 GSEventRunModal + 160 29 UIKit 0x25935fb5 UIApplicationMain + 144 30 Simple Meeting Minutes 0x8c59f main (main.m:16) 31 libdispatch.dylib 0x212fc873 (Missing) 

这是我的saveItemEntry代码,它似乎总是发生崩溃的地方。

 - (void)saveItemEntry:(MMitem *)item{ if (item) { NSString *resultStr = [self.meetingModel saveItem:item]; if ([resultStr isEqualToString:@"OK"]) { // all good so close form and refresh data [_itemViewController dismissViewControllerAnimated:NO completion:nil]; [self.tableView reloadData]; // or if there is an error result then display message } else if ([resultStr isEqualToString:@"DescriptionNotesMissing"]) { [self showAlert:@"Missing Description or Notes" :@"An Item Description or Notes is required" :0]; [self.itemViewController.itemDescription becomeFirstResponder]; } // for any other error do nothing } } 

我们不知道您是否在主线程中调用此方法。

tableview正在花时间重新加载它的单元格。 如果你可以在dispatch_get_main_queue添加这些代码,那就太棒了

 dispatch_async(dispatch_get_main_queue(), ^(void){ [_itemViewController dismissViewControllerAnimated:NO completion:nil]; [self.tableView reloadData]; } 

 dispatch_async(dispatch_get_main_queue(), ^(void){ [self showAlert:@"Missing Description or Notes" :@"An Item Description or Notes is required" :0]; [self.itemViewController.itemDescription becomeFirstResponder]; } 

如果我们正在使用dispatch_async(dispatch_get_main_queue(), ^(void){从任何通知或委派中刷新UI,那将是非常安全的。

万岁 – 终于找到了这个难以捉摸的问题的原因。 崩溃是由于用户在调用reloadData时在表格中的单元格内的UITextfield内处于编辑模式(由于用户在其他地方敲击或旋转iPad,也称为ReloadData )。

我通过在[self.view endEditing:YES]任何[self.tableView ReloadData]解决了这个问题,以确保键盘被解除并且单元格不处于编辑模式。

有意义,但多么令人讨厌的陷阱。