2011-09-06 70 views
0

我有一段代码,当执行时会给我这个错误。而且我相对较新,似乎无法解决问题。NSMutable Array超越界限

错误: 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

'[[NSMutableArray alloc] initWithObjects:0,nil];'。 NSArray只能包含对象,而不能包含原始类型,所以需要将它们包装起来。 '[[NSMutableArray alloc] initWithObjects:[NSNumber numberWithInt:0],nil];' – albertamg

+0

@Bavarious仍然给出同样的错误。 – ilaunchpad

+0

@ila我印象这个问题是在别的地方,这就是为什么我删除了我的答案。不过,我写的东西(和albertamg发表的评论)仍然有效。 – 2011-09-06 17:50:25

回答

2

有多种问题在这里:

1)NSArrays只能包含NSObjects。

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

你必须在一个NSNumber封装的0值,而不是:

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

使用[percentArray objectAtIndex:0]然后检索的NSNumber并最终转换回取出N个SNumber为int使用NSNumberintValue方法:

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)你有例外的情况是,其实其他地方更加微妙:你是在一个NSUInteger变量检索[testarray count]价值,这是一个无符号类型。然后totalRows-1会做一些棘手的事情,如果totalRows等于0(这是很明显的情况考虑你有例外)。

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

这就是为什么i总是比这个数值totalRows-1少(因为这个值是不是-1,但为0xFFFFFFFF = NSUInteger_MAX)。

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

+0

回答编辑:实际找到真正的原因 – AliSoftware

+0

我修复了NSUInteger,它摆脱了错误。现在我还有其他问题,我知道现在它不会超越循环。 – ilaunchpad

+0

很高兴我解决你的问题,然后(因为它有点棘手,看到!):) – AliSoftware

0

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

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

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

0

错误仅仅意味着您试图在不存在的索引处检索对象。在特定情况下,数组你试图获取对象从索引1

一个简单的例子

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

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