将 NSDictionary 添加到数组中



我不确定我错过了什么,但我在下面有这个循环。当我遍历它时,字典对象每次都会像它一样添加到数组中。但是由于某种原因,下次循环时,它会将所有字典对象值完全替换为它正在循环的当前字典值。因此,例如,当完成循环时,我的数组中有 5 个字典对象,并且它们都具有最新的循环值......

NSMutableArray *events = [NSMutableArray array];
NSMutableDictionary *event = [[NSMutableDictionary alloc]init];
NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"Update"]];
for (int i = 0; i < [array count]; i = i + 2){
    [event setValue:[array objectAtIndex:i+1] forKey:@"Event-Type"];
    [event setValue:[array objectAtIndex:i] forKey:@"date"];
    [events addObject:event];
}
您必须在每个

循环的每次迭代中分配一个新的NSMutableDictionary,无论是在每个循环的开头(即只需将该行移动到循环中),还是在执行 addObject 时,您可以使用[NSDictionary dictionaryWithDictionary: event];

这是因为 NSMutableDictionary 是一个对象;它通过引用传递。因此,您只需将相同的NSMUtableDictionary实例放入数组n次即可。

您可以通过在最后的数组的每个索引处记录对象来查看这一点,并且可以检查内存地址以查看它们是否相同。

目标 C 中的数组传递引用,而不是副本。因此,当您调用 [events addObject:event] 然后稍后写入同一事件时,它会被覆盖并重新添加。只需将字典的创建移动到 for 循环中,您就可以开始了。

您需要在

循环中alloc init字典,并且还需要注意根据Apple标准添加,如果您使用的是字典,请始终使用setObject: forKey:。请参考以下代码:-

NSMutableArray *events = [NSMutableArray array];
NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"Update"]];
for (int i = 0; i < [array count]; i = i + 2){
    NSMutableDictionary *event = [[NSMutableDictionary alloc]init];
    [event setObject:[array objectAtIndex:i+1] forKey:@"Event-Type"];
    [event setObject:[array objectAtIndex:i] forKey:@"date"];
    [events addObject:event];
}

最新更新