2011-03-01 81 views
0

在调试器中,它崩溃,我得到这个错误,但索引号处的对象每次都不断变化。 *终止应用程序由于未捕获的异常 'NSRangeException',原因是: '* - [NSMutableArray的insertObject:atIndex:]:指数15超越界限空阵'不知道为什么循环不起作用?

#define NUMPOINTS 16 
    #define NUMSPRITES 16 

    int myXPoints [NUMPOINTS]; 
    int myYPoints [NUMPOINTS]; 
    CCSprite *mySpritePointers [NUMSPRITES]; 

    NSMutableArray *mySpriteArray = [[NSMutableArray alloc] initWithCapacity:16]; 
    [mySpriteArray insertObject:sprite1 atIndex:0]; 
    [mySpriteArray insertObject:sprite2 atIndex:1]; 
    [mySpriteArray insertObject:sprite3 atIndex:2]; 
    [mySpriteArray insertObject:sprite4 atIndex:3]; 
    [mySpriteArray insertObject:sprite5 atIndex:4]; 
    [mySpriteArray insertObject:sprite6 atIndex:5]; 
    [mySpriteArray insertObject:sprite7 atIndex:6]; 
    [mySpriteArray insertObject:sprite8 atIndex:7]; 
    [mySpriteArray insertObject:sprite9 atIndex:8]; 
    [mySpriteArray insertObject:sprite10 atIndex:9]; 
    [mySpriteArray insertObject:sprite11 atIndex:10]; 
    [mySpriteArray insertObject:sprite12 atIndex:11]; 
    [mySpriteArray insertObject:sprite13 atIndex:12]; 
    [mySpriteArray insertObject:sprite14 atIndex:13]; 
    [mySpriteArray insertObject:sprite15 atIndex:14]; 
    [mySpriteArray insertObject:sprite16 atIndex:15]; 

    mySpritePointers [0] = (CCSprite *)[mySpriteArray objectAtIndex:0]; 
    mySpritePointers [1] = (CCSprite *)[mySpriteArray objectAtIndex:1]; 
    mySpritePointers [2] = (CCSprite *)[mySpriteArray objectAtIndex:2]; 
    mySpritePointers [3] = (CCSprite *)[mySpriteArray objectAtIndex:3]; 
    mySpritePointers [4] = (CCSprite *)[mySpriteArray objectAtIndex:4]; 
    mySpritePointers [5] = (CCSprite *)[mySpriteArray objectAtIndex:5]; 
    mySpritePointers [6] = (CCSprite *)[mySpriteArray objectAtIndex:6]; 
    mySpritePointers [7] = (CCSprite *)[mySpriteArray objectAtIndex:7]; 
    mySpritePointers [8] = (CCSprite *)[mySpriteArray objectAtIndex:8]; 
    mySpritePointers [9] = (CCSprite *)[mySpriteArray objectAtIndex:9]; 
    mySpritePointers [10] = (CCSprite *)[mySpriteArray objectAtIndex:10]; 
    mySpritePointers [11] = (CCSprite *)[mySpriteArray objectAtIndex:11]; 
    mySpritePointers [12] = (CCSprite *)[mySpriteArray objectAtIndex:12]; 
    mySpritePointers [13] = (CCSprite *)[mySpriteArray objectAtIndex:13]; 
    mySpritePointers [14] = (CCSprite *)[mySpriteArray objectAtIndex:14]; 
    mySpritePointers [15] = (CCSprite *)[mySpriteArray objectAtIndex:15]; 

    myXPoints [0] = 61; 
    myXPoints [1] = 61; 
    myXPoints [2] = 61; 
    myXPoints [3] = 61; 
    myXPoints [4] = 180; 
    myXPoints [5] = 180; 
    myXPoints [6] = 180; 
    myXPoints [7] = 180; 
    myXPoints [8] = 300; 
    myXPoints [9] = 300; 
    myXPoints [10] = 300; 
    myXPoints [11] = 300; 
    myXPoints [12] = 420; 
    myXPoints [13] = 420; 
    myXPoints [14] = 420; 
    myXPoints [15] = 420; 

    myYPoints [0] = 37; 
    myYPoints [1] = 110; 
    myYPoints [2] = 182; 
    myYPoints [3] = 253; 
    myYPoints [4] = 37; 
    myYPoints [5] = 110; 
    myYPoints [6] = 182; 
    myYPoints [7] = 253; 
    myYPoints [8] = 37; 
    myYPoints [9] = 110; 
    myYPoints [10] = 182; 
    myYPoints [11] = 253; 
    myYPoints [12] = 37; 
    myYPoints [13] = 110; 
    myYPoints [14] = 182; 
    myYPoints [15] = 253; 

    for (int nSprite = 0; nSprite < NUMSPRITES; nSprite++){ 
     for (int nPoint = 0; nPoint < NUMPOINTS; nPoint++){ 
      c1array = [[NSMutableArray alloc] initWithCapacity:16]; 
      if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){ 
       [c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint]; 
      } 
     } 
    } 

回答

2

的答案是-initWithCapacity:不会做你认为它做的事。您不会得到一个有16个空插槽的阵列,您可以在任何时候插入对象。您仍然会得到一个空的([array count] == 0)数组,并尝试在位置0以外的任何位置插入对象将失败。 capacity参数给运行时间提供了一个关于阵列可能增长多少的高级提示。

为了让你的阵列实际上有16个插槽,所以你可以插入/替换任何索引< 16,你需要添加一些对象,例如, NSNull。

NSMutableArray* myArray = [[NSMutableArray alloc] initWithCapacity: 16]; 
for (int i = 0 ; i < 16 ; ++i) 
{ 
    [myArray addObject: [NSNull null]]; 
} 

// Now the array has a count of 16. 

我不太知道你正在尝试做的,但我怀疑,在你的循环,你应该使用-replaceObjectAtIndex:withObject:而不是-insertObjectAtIndex:

+0

感谢Dude开始工作:D – Dangermouse 2011-03-02 12:45:13

1

你重新分配c1array每个通过你的循环时间。你可能不想这样做。

+0

我删除它和上面的第一个for循环放但它仍然给我同样的错误 – Dangermouse 2011-03-01 16:10:16

0

你不应该在两个for循环(nSprite和nPoint)之间分配c1array吗?

+0

@ראובן,我试过,但错误仍然出现。 – Dangermouse 2011-03-01 16:10:39

0
for (int nSprite = 0; nSprite < NUMSPRITES; nSprite++){ 
    for (int nPoint = 0; nPoint < NUMPOINTS; nPoint++){ 
     c1array = [[NSMutableArray alloc] initWithCapacity:16]; 
     if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){ 
      [c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint]; 
     } 
    } 
} 

如上所述,每次运行循环时都要重新分配NSMutableArray。试试这个:

c1array = [[NSMutableArray alloc] initWithCapacity:16]; 
for (int nSprite = 0; nSprite < NUMSPRITES; nSprite++){ 
    for (int nPoint = 0; nPoint < NUMPOINTS; nPoint++){ 
     if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){ 
      [c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint]; 
     } 
    } 
} 

ASLO我看不出有任何理由去创造你所创造的东西:S

您可以使用循环进行的,而不是重新输入的大部分代码;)

相关问题