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

时间:2014-03-07 13:59:09

标签: objective-c crash nsarray nsdictionary

我想创建一个 NSArray 填充 NSDictionary ,并在控制台中打印每个数组元素的第一个值。

我收到以下错误:

  

由于未捕获的异常'NSRangeException'而终止应用,   原因:' - [__ NSArrayM objectAtIndex:]:索引2超出边界[0 .. 1]'    * 第一次抛出调用堆栈:(0x30d77e83 0x3b0d46c7 0x30cadd95 0xb93b3 0xb8e03 0x3175ccdd 0x30d42e7f 0x30d42a9b 0x30d40e23 0x30cab471   0x30cab253 0x359e52eb 0x33560845 0xb8abd 0x3b5cdab7)

  libc ++ abi.dylib:以未捕获的类型异常终止   NSException

-(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 个答案:

答案 0 :(得分:0)

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

NSDictionary *dictionary;
NSMutableArray *array;

之后你打电话给

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

如果您拥有财产,则使用自己;例如;

@ property(nonatomic, strong) NSDictionary *dictionary;

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

NSDictionary *dictionary;
NSMutableArray *array;

你应该打电话,例如:

array = [NSMutableArray arrayWithObjects: dictionary, nil];
没有自我。但也许你在这个例子中显示了ivar和属性,而且你是按目的去做的。我只想说,如果你按目的这样做,你应该使用不同的名称,以使你的代码更清晰。

您在行中发生的错误:

vardebug = [self.array objectAtIndex:numOp];

在你的第一个循环迭代中,你已经在数组中有一个项目(在分配期间添加),你插入另一个项目,所以你的数组包含2个对象,但你的numOp等于2,它引用数组中的第3个对象(数组为零)基地)因此呼叫超出了界限。我想你想把它改成:

vardebug = [self.array objectAtIndex:i];

希望这个帮助

答案 1 :(得分:0)

vardebug = [self.array objectAtIndex:numOp];替换为vardebug = [self.array objectAtIndex:i];可以避免崩溃。