枚举时替换数组中的对象?

时间:2011-05-17 20:00:13

标签: ios4 iphone-sdk-3.0 enumeration

我正在为我的应用发送更新,要求更新用户数据库。我将数据存储在属性列表中。基本上,数组中的每个点都是NSMutableDictionaries,我需要添加键,替换键等。

我尝试了以下方法,但它会生成一个NSException,

for (NSMutableDictionary *dict in myArray) {

    if ([dict objectForKey:@"someKey"] == nil) {

        //Extract the value of the old key and remove the old key
        int oldValue = [[dict objectForKey:@"key1"] intValue];
        [dict removeObjectForKey:@"key1"];

        [dict setValue:[NSString stringWithFormat:@"%d pts", oldValue] forKey:@"newKey"];

        //Add new keys to dictionnary
        [dict setValue:@"some value" forKey:@"key2"];
        [dict setValue:@"some value" forKey:@"key3"];
        [dict setValue:@"some value" forKey:@"key4"];

        [self.myArray replaceObjectAtIndex:index withObject:dict];

    }

如何以上述方式更新数据?

3 个答案:

答案 0 :(得分:1)

问题是你不能通过快速枚举来修改你正在迭代的数组。

代码片段根本不需要replaceObjectAtIndex:withObject:调用,因为您将对象替换为完全相同的对象!因此,如果删除该行,一切都应该有效。

通常,如果使用带索引的普通旧for循环,即

,则可以避免类似的问题
for (int i = 0; i < [array count]; i++) {
    id obj = [array objectAtIndex:i];
    // ...
}

因为这不会搞乱快速枚举。

答案 1 :(得分:1)

创建数组的副本并枚举副本。通过这种方式,您可以安全地修改原始文件:

for (id obj in [NSArray arrayWithArray:entries]) {
    [entries removeObject:obj];
}

不要使用:

for (int i = 0; i < [array count]; i++) {
    id obj = [array objectAtIndex:i];
    [array removeObject:obj];
}

这样做是因为删除后数组索引会被偏移!

答案 2 :(得分:0)

首先,确保myArray是NSMutableArray。如果是这样,如果您调试类似_NSArrayI unrecognized selector sent to instance的代码,您可能会看到一些错误_NSArrayI意味着它是一个不可变数组。这非常烦人,但尝试通过这样做进行测试。然后,您可以使用mutableArray替换myArray。

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self.myArray];
for (NSMutableDictionary *dict in mutableArray) {

if ([dict objectForKey:@"someKey"] == nil) {

    //Extract the value of the old key and remove the old key
    int oldValue = [[dict objectForKey:@"key1"] intValue];
    [dict removeObjectForKey:@"key1"];

    [dict setValue:[NSString stringWithFormat:@"%d pts", oldValue] forKey:@"newKey"];

    //Add new keys to dictionnary
    [dict setValue:@"some value" forKey:@"key2"];
    [dict setValue:@"some value" forKey:@"key3"];
    [dict setValue:@"some value" forKey:@"key4"];

    [mutableArray replaceObjectAtIndex:index withObject:dict];

}
}