nsmutadedictiondary removeObjectKeyは、リリースされていないvarのexc_bad_accessを投げる

StackOverflow https://stackoverflow.com/questions/2260086

質問

私はプリストを持っています。数十キーがあり、それぞれに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 removiobjforkey:obj] exc_bad_accessを投げます。

これは私には意味がありません。なぜなら、私が理解しているように、exc_bad_accessはメッセージがリリースされた方法に送信されたことを意味するからです。

ここで、「アイテム」はリリースされていませんか? 「アイテム」をほんの数行下にリリースするエラーはありません。

ここで何が起こっているのですか?両方のキーから「string1」を削除するより良い方法はありますか?

ありがとう。

役に立ちましたか?

解決

からではありません item リリースされていませんが item 不変です。

for-inループ内では、移動されているイテレーターを変更することはできません。もしそうなら、プログラムは変異した列挙例をスローします。

あなたは出来る

  • すべてを集めます obj 次に、別の配列に -removeObjectsForKeys: ループの終わりに。 また
  • アイテムのキーのコピーを繰り返します。具体的には、 for (id obj in [item allKeys]).
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top