代码之家  ›  专栏  ›  技术社区  ›  CarloM_dtb

[__NSArray M objectAtIndex:]:索引2超出边界[0..1]'

  •  0
  • CarloM_dtb  · 技术社区  · 11 年前

    我想创建一个 不可变数组 填充 字典 并在控制台中打印每个数组元素的第一个值。

    我收到以下错误:

    由于未捕获的异常“NSRangeException”,正在终止应用程序, 原因:“-[__NSArray M objectAtIndex:]:索引2超出界限[0..1]” * 第一次抛出调用堆栈:(0x30d77e83 0x3b0d46c7 0x30cad95 0xb93b3 0xb8e03 0x3175ccdd 0x30d42e7f 0x30d42a9b 0x30d40e23 0x30cab471 0x30cab253 0x359e52eb 0x3560845 0xb8abd 0x3b5cdab7)
    libc++abi.dylib:以未捕获的异常类型终止 NSE异常

    -(void) listOp {
        NSDictionary *dictionary;
        NSMutableArray *array;
        NSNumber    *refNum;
    
        int numOp = [_refNum intValue];
    
        self.array = [NSMutableArray arrayWithObjects: self.dictionary, nil];
        for ( int i = 0; i < numOp; i++){
            [self.array insertObject:self.dictionary atIndex:i];
    
            NSDictionary* vardebug = nil;
            vardebug = [self.array objectAtIndex:numOp];
            NSString *valuekey = [self.dictionary valueForKey: @"key"];
    
            NSLog(@"Valuekey is: %@", valuekey);
        }
    }
    

    不明白出了什么问题。

    2 回复  |  直到 11 年前
        1
  •  0
  •   Greg    11 年前

    你的代码有点乱。您声明:

    NSDictionary *dictionary;
    NSMutableArray *array;
    

    然后你打电话

    self.dictionary...
    self.array...
    

    例如,如果你有财产,你可以使用self;

    @ property(nonatomic, strong) NSDictionary *dictionary;

    所以基本上,如果你想访问你的:

    NSDictionary*字典;
    NSMutableArray*阵列;
    

    例如,您应该调用:

    array = [NSMutableArray arrayWithObjects: dictionary, nil];
    

    没有自我。但也许你有这个例子中显示的ivar和属性,你是故意这样做的。我只想说,如果你有意这样做,你应该使用不同的名称,只是为了让你的代码更清晰。

    行中发生的错误:

    vardebug = [self.array objectAtIndex:numOp];
    

    在第一次循环迭代中,数组中已经有一个项(在分配期间添加),然后插入另一个项,这样数组包含2个对象,但numOp等于2,这表示数组中的第三个对象(数组为零基),因此调用超出了界限。我想你想把它改成:

    vardebug = [self.array objectAtIndex:i];
    

    希望这有帮助

        2
  •  0
  •   bsarr007    11 年前

    代替 vardebug = [self.array objectAtIndex:numOp]; 通过 vardebug = [self.array objectAtIndex:i]; 应避免碰撞。

    推荐文章