NSMutableArray超出界限

时间:2011-09-06 17:36:31

标签: iphone ios nsmutablearray

我有一段代码,执行时会给我这个错误。而且我比较新,我似乎无法解决问题。

错误: 2011-09-06 12:31:06.094 ForceGauge [266:707] CoreAnimation:忽略异常: * - [NSMutableArray objectAtIndex:]:索引1超出边界[0 .. 0]

-(void)peakCollector:(NSMutableArray *)testarray {

    NSUInteger totalRows = [testarray count];

    NSMutableArray *percentArray = [[NSMutableArray alloc]initWithObjects:0, nil];

    if(forcecontroller.selectedSegmentIndex==0)
        testarray = lbData;
    else if(forcecontroller.selectedSegmentIndex==1)
        testarray = kgData;     
    else if(forcecontroller.selectedSegmentIndex ==2)
        testarray = ozData;
    else if(forcecontroller.selectedSegmentIndex ==3)
        testarray = newtonData;

    for(int i = 0; i< totalRows-1; i++) {

        if ([[testarray objectAtIndex:i+1] doubleValue] >= 1.2 * [[testarray objectAtIndex:i] doubleValue]) {
            percentArray = [testarray objectAtIndex:i];

            DatabaseTable *tableVC = [[DatabaseTable alloc] initWithStyle:UITableViewStylePlain];
            [self.navigationController pushViewController:tableVC animated:YES];

            if(forcecontroller.selectedSegmentIndex==0)
                [tableVC copydatabase:percentArray];
            else if(forcecontroller.selectedSegmentIndex==1)
                [tableVC copydatabase:kgData];
            else if(forcecontroller.selectedSegmentIndex==2)
                [tableVC copydatabase:ozData];
            else if(forcecontroller.selectedSegmentIndex==3)
                [tableVC copydatabase:newtonData];

            [tableVC release];
        } else {
            [analogData removeAllObjects];
        }
    }
}

3 个答案:

答案 0 :(得分:2)

这里有多个问题:

1)NSArrays只能包含NSObjects。

在您的代码中,您使用[[NSMutableArray alloc]initWithObjects:0, nil];初始化NSArray,但0是原子类型,而不是NSObject (基本上0是与nil相同的值(nil和NULL通常等于0,分别解释为idvoid*类型)

您必须将您的0值封装在NSNumber中:

[[NSMutableArray alloc]initWithObjects:[NSNumber numberWithInt:0], nil];

然后使用[percentArray objectAtIndex:0]检索NSNumber,最后使用NSNumber的{​​{1}}方法将检索的NSNumber转换回int:

intValue

2)您获得的异常事实上在其他地方并且更加微妙:您正在检索NSNumber* number = [percentArray objectAtIndex:0]; // returns an NSNumber which is an NSObject encapsulating numbers, see Apple's documentation int val = [number intValue]; // retrieve the integer value encapsulated in the NSNumber // or directly: // int val = [[percentArray objectAtIndex:0] intValue]; 变量中的[testarray count]值,这是一个无符号类型。如果totalRows等于0,那么NSUInteger会做一些棘手的事情(考虑到你的例外,这显然就是这种情况)。

由于totalRows-1totalRows,当它等于0时,NSUInteger将不等于-1,而是等于...... totalRows-1( - 1解释为无符号整数),即0xFFFFFFFF,或(NSUInteger)-1类型的最大值!

这就是为什么NSUInteger始终小于此i值(因为此值不是-1但 0xFFFFFFFF = NSUInteger_MAX )。

要解决此问题,请将totalRows-1变量强制转换为NSInteger值,或在代码中添加条件以单独处理此特殊情况。

答案 1 :(得分:0)

请检查测试数组在for循环开始时包含的对象数。

其他可以帮助的是避免使用NSUInteger并使用简单的int来存储数组计数。

如果这不起作用,请发帖。

答案 2 :(得分:0)

错误只是意味着您尝试在不存在的索引处检索对象。在您的特定情况下,您尝试从中获取对象的数组在索引1处没有对象

一个简单的例子

[0] => MyCoolObject
[1] => MySecondObject
[2] => ObjectTheThird

您可以访问数组的索引0,1,2,因为它们包含对象。如果您现在尝试访问索引3,则会抛出Out of bounds异常,因为索引3不存在。