addObject NSMutableDictionary 到 NSMutableArray 只存储指针而不是值?
addObject NSMutableDictionary to a NSMutableArray only storing pointers not values?
我正在使用以下代码:
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;
}
我错过了什么?
每次迭代都需要创建一个新字典:
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);
您的代码正在创建一个数组,其中包含对同一个字典的多个引用,其中最后一次迭代是为所有这些字典设置值。
addObject 存储对对象的引用并增加保留计数。如果您添加一个可变对象,那将很危险,因为当可变对象在您的数组或字典中时,可以进一步更改它。
避免这种情况的最简单方法是调用 addObject:[myMutableObject copy]。如果 myMutableObject 确实是可变的,那么将制作一个不可变的副本并将其添加到您的数组或字典中。如果它不是可变的,那么副本除了 returns 同一个对象之外实际上什么都不做——很明显,无论你使用原件还是副本都没有区别。
我正在使用以下代码:
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;
}
我错过了什么?
每次迭代都需要创建一个新字典:
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);
您的代码正在创建一个数组,其中包含对同一个字典的多个引用,其中最后一次迭代是为所有这些字典设置值。
addObject 存储对对象的引用并增加保留计数。如果您添加一个可变对象,那将很危险,因为当可变对象在您的数组或字典中时,可以进一步更改它。
避免这种情况的最简单方法是调用 addObject:[myMutableObject copy]。如果 myMutableObject 确实是可变的,那么将制作一个不可变的副本并将其添加到您的数组或字典中。如果它不是可变的,那么副本除了 returns 同一个对象之外实际上什么都不做——很明显,无论你使用原件还是副本都没有区别。