我知道我在某处有个窃听器。我确实是一个非常简单的bug,它只是一个索引越界错误.我过去常常在我的项目中寻找和放置断点,以查看它在哪里。但今天我决定聪明一点,真正学会阅读错误消息,因为我知道它们都在那里!但是我不知道怎么读,我试着用谷歌搜索,似乎没有人给我一个好的解释!
有人能帮我读一下这条错误信息吗?
2011-02-01 00:28:04.952 FBDiary[44083:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 26 beyond bounds [0 .. 25]'
*** Call stack at first throw:
(
0 CoreFoundation 0x011dabe9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x0132f5c2 objc_exception_throw + 47
2 CoreFoundation 0x011d06e5 -[__NSArrayM objectAtIndex:] + 261
3 FBDiary 0x00007035 -[FBFriendsList tableView:heightForRowAtIndexPath:] + 101
4 UIKit 0x004a3334 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 2888
5 UIKit 0x004a1e8b -[UITableViewRowData(UITableViewRowDataPrivate) _ensureSectionOffsetIsValidForSection:] + 152
6 UIKit 0x004a0a0c -[UITableViewRowData numberOfRows] + 145
7 UIKit 0x003578c2 -[UITableView noteNumberOfRowsChanged] + 132
8 UIKit 0x003642b8 -[UITableView reloadData] + 773
9 UIKit 0x04e5d1f0 -[UITableViewAccessibility(Accessibility) reloadData] + 60
编辑:所以在发布问题几分钟后,我发现了bug……正如您所说,它在tableView:heightForRowAtIndexPath:
函数中。然而,我真正想知道的是,我能从这个堆栈跟踪中推断出导致问题的行吗?
发布于 2011-01-31 13:41:50
没什么可读的。像往常一样,仅靠堆栈跟踪并不能帮助您修复bug。
对于这个bug,您需要了解UITableViewDatasource协议。
这个错误是由-[FBFriendsList tableView:heightForRowAtIndexPath:]
引起的,您很可能会尝试访问数据数组的一个元素,因为您希望返回相应的高度。
因此,将您对UITableViewDatasource的了解与您的异常结合起来。
您对数据源的了解应该会告诉您,表视图要求为当前可见的所有单元格提供heightForRowAtIndexPath。
它还应该告诉你,你已经告诉了tableview它应该访问多少行。
如果您将这些知识和您的异常结合起来,您应该得出结论,您在- (NSInteger)tableView:(UITableView *)tableView_ numberOfRowsInSection:(NSInteger)section
中返回的值是错误的,并且很可能是26,而它应该是25。
这是UITableView中最常见的bug。
发布于 2011-01-31 13:40:04
有趣的部分是[FBFriendsList tableView:heightForRowAtIndexPath:]
,它是您的代码的(一个也是唯一的)部分,它是堆栈跟踪的一部分,所以您必须在那里查找错误。
上面的几行是对数组的访问和抛出异常的结果进度。下面的代码行是UIKit的基类,它们“托管”你的应用程序代码,负责在正确的时间调用正确的部分。
发布于 2011-01-31 13:41:33
它看起来像是FBFriendsList高度的回调传递的NSIndexPath超出了数组的界限。无论在哪里使用FBFriendsList,都需要设置断点并检查数组中的项数,还需要检查正在传递的NSIndexPath。
https://stackoverflow.com/questions/4851417
复制