在用户升级到iOS 9之后,我们注意到一系列Bad Access(EXC_BAD_ACCESS
)崩溃,这些崩溃对于仍在iOS 8上的用户来说不会出现.当我们调用endUpdates
UITableView 时会发生这种情况.
崩溃日志包括以下原因:
在当前参数寄存器中找到的选择器名称:numberOfRowsInSection:
在当前参数寄存器中找到的选择器名称:indexPathForRowAtGlobalRow:
堆栈跟踪#1:
1 UIKit __46-[UITableView _updateWithItems:updateSupport:]_block_invoke + 92 2 UIKit __46-[UITableView _updateWithItems:updateSupport:]_block_invoke1007 + 224 3 UIKit -[UITableView _updateWithItems:updateSupport:] + 2556 4 UIKit -[UITableView _endCellAnimationsWithContext:] + 12892 [...]
堆栈跟踪#2:
1 UIKit __46-[UITableView _updateWithItems:updateSupport:]_block_invoke + 100 2 UIKit -[UITableViewRowData globalRowForRowAtIndexPath:] + 102 3 UIKit __46-[UITableView _updateWithItems:updateSupport:]_block_invoke1007 + 182 4 UIKit -[UITableView _updateWithItems:updateSupport:] + 2300 5 UIKit -[UITableView _endCellAnimationsWithContext:] + 10552
我们能够重新解决这个问题,但是没有任何关于如何修复它的线索.
当您的UITableView没有导致endUpdates与EXC_BAD_ACCESS崩溃的行时,看起来iOS9中存在一个错误.要解决此错误,您必须在调用beginUpdates之前调用tableView reloadData.
从Claudio Redi指导我的主题:iOS9 iPad UITableView Crash(EXC_BAD_ACCESS)第一部分插入,我实现了你在调用之前添加的以下解决方法[tableView beginUpdates];
if ([[NSProcessInfo processInfo] operatingSystemVersion].majorVersion >= 9) { // there's a bug in iOS9 when your UITableView has no rows that causes endUpdates to crash with EXC_BAD_ACCESS // to work around this bug, you have to call tableView reloadData before calling beginUpdates. BOOL shouldReloadData = YES; NSInteger numberOfSections = [tableView.dataSource numberOfSectionsInTableView:tableView]; for (NSInteger section = 0; section < numberOfSections; section++) { if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] > 0) { // found a row in current section, do not need to reload data shouldReloadData = NO; break; } } if (shouldReloadData) { [tableView reloadData]; } }