【问题标题】:Don't know why loop does not work?不知道为什么循环不起作用?
【发布时间】:2011-03-01 14:08:23
【问题描述】:

在调试器中它崩溃了,我得到了这个错误,但索引号的对象每次都在变化。 * 由于未捕获的异常 'NSRangeException' 导致应用程序终止,原因:'* -[NSMutableArray insertObject:atIndex:]: index 15 beyond bounds for empty array'

    #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];
            } 
        }
    }

【问题讨论】:

    标签: objective-c loops for-loop cocos2d-iphone


    【解决方案1】:

    答案是-initWithCapacity: 并没有按照你的想法去做。您不会得到一个包含 16 个空槽的数组,您可以随时将对象插入其中。您仍然会得到一个空 ([array count] == 0) 数组,并且尝试在除位置 0 之外的任何位置插入对象都会失败。容量参数只是给运行时一个关于阵列可能增长多大的高级提示。

    要使您的数组实际上有 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.
    

    我不太确定您要做什么,但我怀疑,在您的 for 循环中,您应该使用 -replaceObjectAtIndex:withObject: 而不是 -insertObjectAtIndex:

    【讨论】:

      【解决方案2】:

      您每次都在循环中重新分配 c1array。你可能不想这样做。

      【讨论】:

      • 我将其删除并放在第一个 for 循环之上,但它仍然给我同样的错误
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        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];
                } 
            }
        }
        

        我看不出有什么理由去创造你正在创造的东西:S

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-23
          • 2018-06-05
          • 2014-01-04
          • 2020-01-11
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          相关资源
          最近更新 更多