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 同一个对象之外实际上什么都不做——很明显,无论你使用原件还是副本都没有区别。