索引超出界限错误

时间:2013-02-25 23:28:50

标签: objective-c uitableview nsuinteger

我收到此错误:

-[__NSArrayM objectAtIndex:]: index 556503008 beyond bounds [0 .. 2]'

以下是应用崩溃的地方:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSUInteger index = [[Data singleton].annotations objectAtIndex:indexPath.row];
    self.pinVC = [[PinViewController alloc]init];
    [self.pinVC setIdentifier:index];
    [[self navigationController]pushViewController:self.pinVC
                                      animated:YES];
 }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.pinArray.count;
}

我是Objective C的新手,我不知道为什么会这样。有人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

您的pinArray变量可能与您在单例阵列上对objectAtIndex:的调用不匹配。假设[[Data singleton].annotations包含与pinArray变量相同类型的信息,那么您可以尝试:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSNumber *num = [self.pinArray objectAtIndex:indexPath.row];
    NSInteger index = [num integerValue]; //<-As an aside, observe I converted the number to integer type
    ...
    ...
}

这个想法是你可能会返回比数组中的注释对象更多的行数,因此超出边界错误。

否则你应该这样做:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSNumber *num = [[Data singleton].annotations objectAtIndex:indexPath.row];
    NSInteger index = [num integerValue]; //<-As an aside, observe I converted the number to integer type
    ...
    ...
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    return [Data singleton].annotations.count;
}

答案 1 :(得分:0)

这可能是这一行:

    NSUInteger index = [[Data singleton].annotations objectAtIndex:indexPath.row];

objectAtIndex返回一个对象,但是您将结果分配给一个原语(NSUInteger,这是一个未签名的int的奇特名称)。我很惊讶XCode没有在这条线上给你警告。你在annotations中存储了什么?

错误本身是一个超出界限的错误 - 虽然我认为这意味着它可以成为索引路径本身,正如Jeremy在评论中建议的那样,你正试图访问位置556503008阵列向我暗示它不是。

答案 2 :(得分:0)

所以我意识到我的意思是获取对象的索引,但是我将对象分配给NSUInteger,当它是自定义类的实例时。所以我只是改变了这行代码:

NSUInteger index = indexPath.row;