我有一个plist。它有几十个键,每个键都有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'是不是发布了呢?我没有错误发布'item'只是低了几行。
这里发生了什么?有没有更好的方法从两个键中删除“String1”?
感谢。
答案 0 :(得分:0)
这不是因为item
未发布,而item
是不可变的。
在for-in循环中,无法更改正在遍历的迭代器。如果这样做,程序将抛出一个变异的枚举异常。
你可以
obj
收集到一个单独的数组中,然后在循环结束时收集-removeObjectsForKeys:
; 或 for (id obj in [item allKeys])
。