0

私はリストを持っています。数十個のキーがあり、それぞれに 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」を削除するより良い方法はありますか?

ありがとう。

4

1 に答える 1

0

itemリリースされていないからではなく、item不変です。

for-in ループ内では、トラバースされている反復子は変更できません。その場合、プログラムは変更された列挙例外をスローします。

あなたは出来る

  • objすべてを別の配列に集めて-removeObjectsForKeys:から、ループの最後に。また
  • アイテムのキーのコピーを反復します。具体的には、for (id obj in [item allKeys]).
于 2010-02-14T08:26:05.440 に答える