当insertObject抛出错误时,如何在索引0处添加对象?

时间:2012-08-13 05:13:28

标签: iphone objective-c nsmutablearray

如果先前删除了第一个索引,我们如何在索引0处将对象添加到NSMutableArray? insertObject不起作用:

  

由于未捕获的异常'NSRangeException'而终止应用程序,原因:' * - [__ NSArrayM removeObjectAtIndex:]:索引2超出边界[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;
}

由于

3 个答案:

答案 0 :(得分:1)

如果你仔细阅读那个例外

  

由于未捕获的异常'NSRangeException'而终止应用程序,原因:   '* - [__ NSArrayM removeObjectAtIndex:]:索引2超出边界[0 .. 1]'

你会发现它实际上是你提到的那条线之前的线路上的崩溃。这条线很好:

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

前一个崩溃:

[sprites removeObjectAtIndex:2];

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

答案 1 :(得分:1)

你之前崩溃,在那里你试图操纵索引2处的对象。错误消息清楚地表明你正在尝试删除一个对象,并从索引2中删除。唯一的地方就是您发布的代码是

[sprites removeObjectAtIndex:2];

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

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

答案 2 :(得分:-1)

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

[sprites removeObjectAtIndex:2];

失败并显示您发布的错误消息。检查调试器并验证lines1,lines2和lines3不是nil