Добавление объекта в Objective C NSMutableArray выводит меня из цикла «For» для другого массива - PullRequest
0 голосов
/ 03 января 2012

Я пытаюсь заполнить один 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 голосов
/ 19 января 2012

Как уже упоминалось в одном из моих комментариев выше:

Добавление некоторых журналов помогло. Это заставило меня посмотреть журнал консоли, который фактически извергал ошибку (или, возможно, предупреждение), которая препятствовала добавлению объекта в массив. Строка инициализации чуть выше добавления не удалась, потому что текстура не может быть найдена.

Так что я неправильно истолковал симптомы, и в результате тема здесь может быть немного обманчива для людей, посещающих ее в будущем.

0 голосов
/ 03 января 2012

1 / По договоренности лучше использовать самый длинный метод init .... Попробуйте использовать initWithCapacity: вместо базового метода init в NSMutableArray. 2 / Также после добавления вашего объекта в NSMutableArray вы должны освободить его, чтобы массив мог быть единственным владельцем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...