NSMutableArray多次添加相同的NSDictionary

时间:2015-06-20 23:48:00

标签: ios objective-c for-loop nsarray nsdictionary

我循环遍历数组,获取两个项目并将它们放入字典中,然后将它们添加到数组中,但它会继续为数组中的数字对象添加数组的最后一项,即使我在记录循环内的字典,它具有正确的值。这是我的代码

            for (TFHppleElement *element in nodesArray) {

    [nameAndHrefDict setObject:[element objectForKey:@"href"] forKey:@"href"];
    [nameAndHrefDict setObject:[element text] forKey:@"name"];
    NSLog(@"PRE: %@", nameAndHrefDict);
    [arrayOfDicts addObject:nameAndHrefDict];
    NSLog(@"IN: %@", arrayOfDicts);


}

在日志中我看到了这个

PRE: {
href = "/dining-choices/res/index.html";
name = "Commons Dining Hall";
}

IN: (
    {
    href = "/dining-choices/res/index.html";
    name = "Commons Dining Hall";
}
PRE: {
href = "/dining-choices/res/sage.html";
name = "Russell Sage Dining Hall";
}

IN: (
    {
    href = "/dining-choices/res/sage.html";
    name = "Russell Sage Dining Hall";
},
    {
    href = "/dining-choices/res/sage.html";
    name = "Russell Sage Dining Hall";
}
)

发生了什么事?

但它将nodesArray的最后一个值添加8次,而不是每个值,为什么?

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

请尝试:

 for (TFHppleElement *element in nodesArray) {

      [arrayOfDicts addObject:[NSDictionary dictionaryWithObjectsAndKeys:[element objectForKey:@"href"], @"href", [element text], @"name", nil]];
 }

答案 1 :(得分:1)

通过引用将对象添加到数组中。该数组不会创建字典的副本,它只保留已添加的字典的记录。您每次都会向阵列添加相同的字典nameAndHrefDict。因此,数组认为自己多次持有相同的对象。

在每次迭代中,您都在更改该对象的值,但它仍然是同一个对象。

因此,潜在的问题是识别与价值。数组由身份填充。你期望它按价值填充。

修复:在将字典添加到数组时复制字典,或者每次只从头开始创建一个全新的字典。

答案 2 :(得分:0)

每次都需要allocinit数组,以便有新的内存,然后它不会添加相同的数组8次

答案 3 :(得分:0)

您必须在循环中实例化字典:查看代码

NSMutableArray * saveData = [[NSMutableArray alloc] init];

for (int i=0; i<records.count; i++) {

    RecordTable *record = [records objectAtIndex:i];
    NSString *addID = record.addr_id;

    NSMutableDictionary *saveToDic = [[NSMutableDictionary alloc]init];
    [saveToDic setValue:addID forKey:@"addr_id"];

    [saveData addObject:saveToDic];

    }