NSMutableDictionary removeObjectForKey, выбрасывающий EXC_BAD_ACCESS для переменной, которая не выпущена - PullRequest
0 голосов
/ 14 февраля 2010

У меня есть список. Он имеет несколько десятков ключей, каждый с элементами NSMutableArray:

...
<key>KeyName1</key>
<array>
    <string>String1</string>
    <string>String2</string>
    <string>String3</string>
</array>

<key>KeyName2</key>
<array>
    <string>String1</string>
    <string>String2</string>
    <string>String3</string>
</array>
...

Мне нужно удалить «String1» для всех ключей. Это функция, которую я написал:

void DeleteString(NSString *StringToDelete){
NSMutableDictionary *item=nil;  

item = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];   

for (id obj in item){
    NSString *removeThisObject=(NSString *)obj;
    NSArray *ObjectArray = [item objectForKey:obj];

    for (int i = 0; i< [ObjectArray count]; i++){
        NSString *objectString = [ObjectArray objectAtIndex:i];

        if([objectString isEqualToString:StringToDelete]){              
            NSLog(@"Remove This from Item Dictionary: %@",removeThisObject);

            [item removeObjectForKey:obj];          
        }
    }

}
[item writeToFile:filePath atomically: YES];
[item release]; 

}

Я подумал, что будет проще удалить только весь ключ, если он содержит значение, которое я не хочу, но строка: [item removeObjForKey: obj] выбрасывает EXC_BAD_ACCESS.

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

Здесь «предмет» не выпущен, не так ли? У меня нет ошибок при отпускании 'item' всего на несколько строк ниже.

Что здесь происходит? Есть ли лучший способ удалить «String1» из обоих ключей?

Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2010

Это не потому, что item не выпущено, но item является неизменным.

В цикле for-in итератор, который вы пересекаете, не может быть изменен. Если вы это сделаете, программа выдаст мутировавшее исключение перечисления.

Вы могли бы

  • собрать все obj в отдельный массив, затем -removeObjectsForKeys: в конце цикла; или
  • перебрать копию ключей предметов. В частности, for (id obj in [item allKeys]).
...