nsmutadedictiondary removeObjectKeyは、リリースされていないvarのexc_bad_accessを投げる
-
20-09-2019 - |
質問
私はプリストを持っています。数十キーがあり、それぞれに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])
.
所属していません StackOverflow