我使用以下代码:
NSMutableArray *data;
NSMutableDictionary *item;
item = [[NSMutableDictionary alloc] init];
data = [[NSMutableArray alloc] init];
for (int i=1; i <= 3; i++) {
NSString *fn = [NSString stringWithFormat:@"firstname%@", [NSString stringWithFormat: @"%d", i]];
NSString *ln = [NSString stringWithFormat:@"lastname%@", [NSString stringWithFormat: @"%d", i]];
[item setObject:fn forKey:@"firstname"];
[item setObject:ln forKey:@"lastname"];
[data addObject:item];
}
NSLog(@"%@", data);
结果不是firstname1,lastname1,firstname2,lastname2,firstname3,lastname3但是:
{
firstname = firstname3;
lastname = lastname3;
},
{
firstname = firstname3;
lastname = lastname3;
},
{
firstname = firstname3;
lastname = lastname3;
}
我遗失了什么?
答案 0 :(得分:1)
您需要在每次迭代时创建一个新词典:
NSMutableArray *data = [[NSMutableArray alloc] init];
for (int i=1; i <= 3; i++) {
NSMutableDictionary *item = [[NSMutableDictionary alloc] init];
NSString *fn = [NSString stringWithFormat:@"firstname%@", [NSString stringWithFormat: @"%d", i]];
NSString *ln = [NSString stringWithFormat:@"lastname%@", [NSString stringWithFormat: @"%d", i]];
[item setObject:fn forKey:@"firstname"];
[item setObject:ln forKey:@"lastname"];
[data addObject:item];
}
NSLog(@"%@", data);
您的代码正在创建一个包含对同一个字典的多个引用的数组,其中最后一次迭代是为所有这些字典设置值。
答案 1 :(得分:-1)
addObject存储对象的引用并增加保留计数。如果你添加一个可变对象,那将是危险的,因为可变对象可以在你的数组或字典中进一步改变。
避免这种情况的最简单方法是调用addObject:[myMutableObject copy]。如果myMutableObject确实是可变的,则会创建一个不可变的副本并将其添加到您的数组或字典中。如果它不是可变的,那么复制实际上并没有做任何事情,而是返回相同的对象 - 显然无论你是使用原版还是副本都不会产生影响。