【问题标题】:NSMutableDictionary removeObjectForKey throwing EXC_BAD_ACCESS for a var that isn't releasedNSMutableDictionary removeObjectForKey 为未释放的 var 抛出 EXC_BAD_ACCESS
【发布时间】:2010-02-14 03:52:20
【问题描述】:

我有一个列表。它有几十个键,每个键都有 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”?

谢谢。

【问题讨论】:

    标签: macos plist exc-bad-access nsmutabledictionary


    【解决方案1】:

    不是因为item没有发布,而是item是不可变的。

    在 for-in 循环中,正在遍历的迭代器无法更改。如果你这样做了,程序会抛出一个变异的枚举异常。

    你可以

    • 将所有obj收集到一个单独的数组中,然后在循环结束时-removeObjectsForKeys:
    • 迭代项目键的副本。具体来说,for (id obj in [item allKeys])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      相关资源
      最近更新 更多