Ошибка «*** Коллекция <__NSCFDictionary: 0x563560> была изменена при перечислении». - PullRequest
1 голос
/ 27 декабря 2011

Этот код вызывает ошибку, что может быть не так?Я прочитал кое-что о блокировках, и что неизменяемые объекты могут быть подвержены сбоям при использовании в нескольких потоках.Но на самом деле я не знаю, что это все о ...

-(void)cleanUpAllHexagons{

    //Cleaning up all hexagons from previous level
    NSLog(@"cleaning hexagons");
    NSString *spriteKey;
    NSString *touchAreaKey;

    NSMutableDictionary *existingHexagons = [[GameStateSingleton sharedMySingleton]getExistingHexagons];

        for (int i= 0; i < [existingHexagons count]; i++){
            spriteKey = [NSString stringWithFormat:@"hexagon%d",i];

            for (spriteKey in existingHexagons) {
                NSLog(@"the spritekey = %@",spriteKey);
                NSLog(@"%@", existingHexagons);
                NSLog(@"%@", [[existingHexagons valueForKey:spriteKey]objectForKey:@"realSprite"]);
                [self removeChild:[[existingHexagons valueForKey:spriteKey]objectForKey:@"realSprite"] cleanup:YES];
                [existingHexagons removeObjectForKey:spriteKey];
            } 


            hexTouchAreas = [[GameStateSingleton sharedMySingleton]getSharedHexTouchAreas];

            touchAreaKey = [NSString stringWithFormat:@"hexTouchArea%d",i];

            for (touchAreaKey in hexTouchAreas) {
                NSLog(@"the touchAreakey = %@",touchAreaKey);
                NSLog(@"%@", [hexTouchAreas valueForKey:touchAreaKey]);
                [self removeChild: [hexTouchAreas valueForKey:touchAreaKey] cleanup:YES];
            } 

        }  


}

Ответы [ 2 ]

4 голосов
/ 27 декабря 2011

Чтобы перечислить все ключи в этой ситуации, вы можете использовать

for (spriteKey in [existingHexagons allKeys])

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

2 голосов
/ 27 декабря 2011

Вы не можете изменить объект, для которого вы используете быстрое перечисление.

Так что в вашем коде вы не можете сделать

[existingHexagons removeObjectForKey:spriteKey];

внутри

for (spriteKey in existingHexagons)

Потому что вы модифицируете existingHexagons
Вам нужно будет использовать обычный цикл for.

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