-1

当第一个索引先前被删除时,我们如何在索引 0 处将对象添加到 NSMutableArray?insertObject不工作:

由于未捕获的异常“NSRangeException”而终止应用程序,原因:“ * -[__NSArrayM removeObjectAtIndex:]: index 2 beyond bounds [0 .. 1]”

当屏幕向右移动时,我删除数组的第一个索引(不再可见)并将其添加到右侧。但是如果我想回到左边,我必须添加之前删除的图像(现在在索引 2,但图像是相同的,所以如果我只是添加另一个图像并不重要)。addObject在数组末尾添加一个对象,insertObject抛出错误...

你知道有什么办法可以解决这个问题吗?

linesArray = [[NSMutableArray alloc] initWithObjects:lines1, lines2, lines3, nil];

//left direction : add the object at index 0
if (offsetParam >= offset1){
    CCSprite *temp = [[sprites objectAtIndex:1] retain];
    [sprites removeObjectAtIndex:2];
    [sprites insertObject:temp atIndex:0];//****CRASH HERE****
    temp.position = ccp(-offset1-spriteWidth, temp.position.y);
    [temp release];
    offset1 += spriteWidth;
}

谢谢

4

3 回答 3

1

如果您仔细阅读该异常

由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM removeObjectAtIndex: ]: index 2 beyond bounds [0 .. 1]”

你会看到它实际上是在你提到的那一行之前的一次崩溃。这条线很好:

[sprites insertObject:temp atIndex:0];//CRASH HERE****

它是前一个崩溃的:

[sprites removeObjectAtIndex:2];

看起来您有一个包含 2 个项目(索引 0 和 1)的数组,因此删除索引 2 会崩溃,因为没有索引 2。

于 2012-08-13T05:21:29.617 回答
1

您之前在线上崩溃了,您尝试在索引 2 处操作对象。错误消息清楚地表明您正在尝试从索引 2 中删除对象。您在代码中执行此操作的唯一位置''ve posted is the line

[sprites removeObjectAtIndex:2];

您的sprites数组没有您认为的那么多对象。

始终可以插入到NSMutableArray0 的索引中;它适用于空数组或具有任意数量对象的数组。

于 2012-08-13T05:22:05.077 回答
-1

请记住,initWithObjects 是 nil 终止的,这意味着该方法遇到的第一个 nil 将是列表中的最后一个。根据您发布的代码,我的直觉是 lines3 为零,导致您的列表大小为 2,这将导致

[sprites removeObjectAtIndex:2];

因您发布的错误消息而失败。使用调试器检查并验证lines1、lines2 和lines3 不是nil

于 2012-08-13T05:24:45.433 回答