我循环遍历数组,获取两个项目并将它们放入字典中,然后将它们添加到数组中,但它会继续为数组中的数字对象添加数组的最后一项,即使我在记录循环内的字典,它具有正确的值。这是我的代码
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次,而不是每个值,为什么?
感谢您的帮助。
答案 0 :(得分:1)
请尝试:
for (TFHppleElement *element in nodesArray) {
[arrayOfDicts addObject:[NSDictionary dictionaryWithObjectsAndKeys:[element objectForKey:@"href"], @"href", [element text], @"name", nil]];
}
答案 1 :(得分:1)
通过引用将对象添加到数组中。该数组不会创建字典的副本,它只保留已添加的字典的记录。您每次都会向阵列添加相同的字典nameAndHrefDict
。因此,数组认为自己多次持有相同的对象。
在每次迭代中,您都在更改该对象的值,但它仍然是同一个对象。
因此,潜在的问题是识别与价值。数组由身份填充。你期望它按价值填充。
修复:在将字典添加到数组时复制字典,或者每次只从头开始创建一个全新的字典。
答案 2 :(得分:0)
每次都需要alloc
和init
数组,以便有新的内存,然后它不会添加相同的数组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];
}