[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]'

Posted

技术标签:

【中文标题】[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]\'【英文标题】:[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]' 【发布时间】:2014-03-07 13:59:09 【问题描述】:

我想创建一个 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);
    

不明白出了什么问题。

【问题讨论】:

假设 numOp=5。在 for 循环的第一次迭代中,self.array 在索引 5 处没有对象(当您想要获取 vardebug 时),它只有 2 个对象。 你到底想做什么? 【参考方案1】:

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

NSDictionary *dictionary;
NSMutableArray *array;

然后你打电话

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

例如,如果您有财产,则使用 self;

@property(nonatomic, strong) NSDictionary *dictionary;

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

NSDictionary *dictionary;
NSMutableArray *array;

你应该打电话,例如:

array = [NSMutableArray arrayWithObjects: dictionary, nil];

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

你在行中发生的错误:

vardebug = [self.array objectAtIndex:numOp];

在您的第一次循环迭代中,您已经在数组中有一个项目(在分配期间添加)并且您插入另一个项目,因此您的数组包含 2 个对象但您的 numOp 等于 2,它引用数组中的第 3 个对象(数组为零base) 所以调用是越界的。我猜你想把它改成:

vardebug = [self.array objectAtIndex:i];

希望有帮助

【讨论】:

是的,我已经在函数中添加了这个声明,但是这些声明是在 .h 之类的属性中声明的,所以我从函数中调用。感谢您的帮助,这是一个失误。【参考方案2】:

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

【讨论】:

当您在 NSMutableArray 中的索引 0 处有某个项目,然后您在索引 0 处插入另一个项目时,应用程序不会崩溃,它将在索引 0 处插入第二个项目,并在索引处移动第一个项目1.

以上是关于[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]'的主要内容,如果未能解决你的问题,请参考以下文章

[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]'

NSRangeException',原因:'*** -[__NSArrayM objectAtIndex:]:空数组的索引 5 超出范围'

-[__NSArrayM objectAtIndex:]: 索引 11 超出界限 [0 .. 10]' 目标 c

[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]

由于未捕获的异常“NSRangeException”而终止应用程序。 [__NSArrayM objectAtIndex:]:索引 33 超出范围 [0 .. 32]'

-[__NSArrayM objectAtIndex:]:索引 0 超出了带有 userInfo 的空数组的界限(null)