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

错误:
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];
        }
    }
}

最佳答案

这里有多个问题:

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,最后使用NSNumberintValue方法将检索到的NSNumber转换回int:

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];


2)实际上,您在其他地方遇到的异常更加微妙:您正在获取[testarray count]变量中的NSUInteger值,该变量是无符号类型。如果totalRows等于0,那么totalRows-1会做一些棘手的事情(考虑到您的异常,显然是这种情况)。

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

这就是为什么totalRows-1始终小于此totalRows值的原因(因为该值不是-1,而是0xFFFFFFFF = NSUInteger_MAX)。

要解决此问题,请将您的变量强制转换为NSInteger值,或在代码中添加条件以分别处理此特殊情况。

关于iphone - NSMutableArray超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7323848/

10-09 16:31