我遇到了Crashlytics提出的以下问题:
[__NSArrayM objectAtIndexedSubscript:]: index 5 beyond bounds for empty array
-TopicListViewController tableView:cellForRowAtIndexPath:]
使用indexPath.row
访问数据源时。
我们有一些异步数据更新来更新数据源,并且该变量是非原子的。
是否有可能在更新数据源时调用cellForRowAtIndexPath
?因此导致访问不再存在的索引吗?
是因为变量不是原子的吗?
这是相关代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.row > [self.tableData count] - 1 || ![self.tableData isValidArray]) {
return nil; //Some protection to prevent this issue...
}
TopicCell * cell = (TopicCell *)[tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.delegate = self;
NSDictionary * data = nil;
if (self.we_isSearching) {
data = self.we_searchResult[indexPath.row];
} else {
data = [self.tableData objectAtIndex:indexPath.row]; //Crashes here
}
答案 0 :(得分:2)
“ index 5 beyond bounds for empty array
”只是说明您没有初始化数组,或者您正在访问的值的范围超出了数组的范围。您正在尝试在一个空的/元素较少的数组或未初始化的数组中访问索引5,这就是为什么它在cellForRowAtIndexPath
中为您提供“ outOfBounds”的原因。
是否有可能在更新dataSource时调用cellForRowAtIndexPath?
是的,当您要查看新的表格视图单元格时(例如,在滚动表格视图时)或者如果您已经向数据源中添加了某种通知或通过重新加载表格视图,将始终调用cellForRowAtIndexPath
您可以在cellForRowAtIndexPath
处放置一个断点,并检查堆栈跟踪,也许您发现某些东西导致重新加载表格视图。
答案 1 :(得分:0)
尝试从self.tableData进行计数,以返回numberOfRowsInSection
方法。喜欢
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.tableData count];
}
答案 2 :(得分:0)
通过tableView方法的numberOfRowsInSection中的数组计数。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return array.count;
}
答案 3 :(得分:-1)
您的状况
if (indexPath.row > [self.tableData count] - 1 || ![self.tableData isValidArray])
是错误的。如果有5个元素,则最后一个indexPath.row将是索引4,因此具有实际值的条件将是:
if (4 > 5 - 1) --> if 4 > 4
所以有效条件是:
if (indexPath.row >= [self.tableData count] - 1)
但是如果条件正确,您将在以下位置崩溃:
return nil
显然,您的数据源与表数据源不同。您的模型数据源应始终与表数据源相同。