将对象添加到Objective-C NSMutableArray正在踢出另一个数组的“For”循环

时间:2012-01-03 02:33:54

标签: objective-c nsmutablearray

我正在尝试使用来自第二个NSMutableArray的对象填充一个NSMutableArray,同时在第二个数组的For循环内填充。当我向第一个数组添加一个对象时,我被踢出了循环。这发生在COCOS2D应用程序中的“计划”回调中。

奇怪的是,它在一种情况下工作正常,但在另一种情况下则不然。它的第一次工作在下面的代码示例中说明。第二次也在代码中注明,相关的行用5 *表示。唯一根本不同的是第二个例子在While循环内部反复发生,不断地填充和清空第二个NSMutableArray

有些东西显然正在发生,我只是不明白。我希望有人能够抓住它。

提前感谢您的帮助!

以下代码是该方法的相关部分:

NSMutableArray *gameSprites = [[NSMutableArray alloc] init];
NSMutableArray *guns = [[NSMutableArray alloc] init];
NSMutableArray *newGuns = [[NSMutableArray alloc] init];

// START OF THE FIRST EXAMPLE 

// collect sprites that are guns
for (LPSprite *sprite in gameSprites)
{
    if ([sprite isGun])
    {
        [guns addObject:gun];
    }
}

// END OF THE FIRST EXAMPLE


// do work for all guns in gamesprite collection
int numGuns = [guns count];

while (numGuns > 0)
{

    // START OF THE SECOND EXAMPLE

    for (LPGun *gun in guns)
    {

        if (special condition that only occurs sometimes)
        {       
            LPGun *portalGun = [[LPGun alloc] init];

            // ***** When this line is executed, I get 'kicked' out of the method and execution starts again at the beginning of the method. No exception is thrown or noticed.
            [newGuns addObject:portalGun];
        }
    }

    numGuns = [newGuns count];

    // empty gun collection and add any 'new' guns to the collection so the above work can be repeated
    [guns removeAllObjects];

    for (LPGun *g in newGuns)
    {
        [guns addObject:g];
    }

    [newGuns removeAllObjects];

    // END OF THE SECOND EXAMPLE
}

2 个答案:

答案 0 :(得分:0)

1 /按照惯例,最好使用最长的init ...方法。尝试使用initWithCapacity:而不是NSMutableArray上的基本init方法。 2 /在将对象添加到NSMutableArray之后,必须释放它以使该数组成为唯一所有者。

答案 1 :(得分:0)

正如我上面的一条评论所述:

添加一些日志记录有帮助。它强迫我查看控制台日志,该日志实际上是一个错误(或可能是警告),它阻止了对象被添加到数组中。添加上方的init行失败,因为无法找到纹理。

所以我误解了这些症状,因此这里的话题对于将来访问它的人来说可能有点误导。