如何理解目标c中的错误消息?

时间:2011-01-31 13:33:33

标签: objective-c uikit

我知道我的某个地方有一个错误...我确实是一个非常简单的错误,它只是一个超出范围的索引错误。我曾经在我的项目中寻找并放置断点以查看它的位置。但是今天我决定要聪明并且真正学会阅读错误信息,因为我知道它就在那里!但我不知道如何阅读它,我尝试谷歌搜索,似乎没有人给我一个很好的解释!

有人可以帮我看一下这条错误信息吗?

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

编辑:所以在发布问题后几分钟我发现了这个错误...正如你所说的那样,它位于tableView:heightForRowAtIndexPath:函数中。然而,我真正想知道的是,我可以从这个堆栈跟踪中推断它导致问题的行吗?

3 个答案:

答案 0 :(得分:1)

有趣的部分是[FBFriendsList tableView:heightForRowAtIndexPath:],它是代码的(唯一)部分,它是此堆栈跟踪的一部分,因此您必须在那里查找错误。

上面的行是对数组的访问以及抛出异常的结果进度。下面的行是UIKit的基类,它们“托管”您的应用程序代码,并负责在正确的时间调用正确的部分。

答案 1 :(得分:1)

看起来行的FBFriendsList高度的回调是传递超出数组范围的NSIndexPath。你有FBFriendsList,你需要设置断点并检查数组中的项目数,并检查传递的NSIndexPath。

答案 2 :(得分:1)

没有太多要阅读的内容。像往常一样,stacktrace本身并不能帮助你修复bug。

对于此错误,您需要了解UITableViewDatasource协议。

错误是由-[FBFriendsList tableView:heightForRowAtIndexPath:]引起的,您最有可能尝试访问数据数组的元素,因为您想要返回相应的高度。

因此,将您对UITableViewDatasource的了解与您的例外结合起来 您对数据源的了解应该告诉您tableview要求当前可见的所有单元格的heightForRowAtIndexPath。
它还应该告诉你,你已经告诉tableview它应该访问多少行。

如果你将这些知识与你的例外结合起来,你应该得出结论:你在- (NSInteger)tableView:(UITableView *)tableView_ numberOfRowsInSection:(NSInteger)section中返回的值是错误的,而且很可能是26,它应该是25。

这是UITableView最常见的错误。