2010-02-14 25 views
0

我有一個plist。它有幾十個鍵,每個鍵的NSMutableArray項目:NSMutableDictionary removeObjectForKey爲未發佈的變種拋出EXC_BAD_ACCESS

... 
<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]; 

}

我想它會更容易,如果它包含我不希望值只刪除整個密鑰,但行:[項目removeObjForKey:obj]拋出一個EXC_BAD_ACCESS。

這對我來說沒有意義,因爲據我瞭解,EXC_BAD_ACCESS表示消息已發送到已發佈的方法。

在這裏,'物品'是不是發佈了嗎?我沒有錯誤發佈「項目」,只是低了幾行。

這是怎麼回事?是否有更好的方法從兩個鍵中刪除「String1」?

謝謝。

回答

0

這不是因爲item沒有發佈,而是item是不可變的。

在for-in循環中,正在遍歷的迭代器不能更改。如果你這樣做,程序將拋出一個突變的枚舉異常。

你可以

  • 在循環的末尾收集所有obj到一個單獨的磁盤陣列,然後-removeObjectsForKeys:;
  • 迭代項目的鍵的副本。具體而言,for (id obj in [item allKeys])
+1

我是個白癡。我不知道爲什麼我沒有看到。 – 2010-02-14 18:57:21

相關問題