addObject NSMutableDictionary到NSMutableArray只存储指针而不是值?

时间:2015-11-15 11:43:12

标签: objective-c nsmutablearray nsarray

我使用以下代码:

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;
}

我遗失了什么?

2 个答案:

答案 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确实是可变的,则会创建一个不可变的副本并将其添加到您的数组或字典中。如果它不是可变的,那么复制实际上并没有做任何事情,而是返回相同的对象 - 显然无论你是使用原版还是副本都不会产生影响。