NSMutableArray 多次添加相同的 NSDictionary
NSMutableArray adds same NSDictionary multiple times
我正在遍历一个数组,获取两个项目并将它们放入字典中,然后将它们添加到一个数组中,但它一直在为数组中的数字对象添加数组的最后一项,即使当我在循环中记录字典时,它具有正确的值。这是我的代码
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 次,而不是每个值,为什么?
提前感谢您的帮助。
请尝试:
for (TFHppleElement *element in nodesArray) {
[arrayOfDicts addObject:[NSDictionary dictionaryWithObjectsAndKeys:[element objectForKey:@"href"], @"href", [element text], @"name", nil]];
}
对象通过引用添加到数组。该数组不会创建字典的副本,它只是记录添加了哪个字典。您每次都向数组添加相同的字典 nameAndHrefDict
。所以数组认为自己多次持有同一个对象。
在每次迭代中,您都在更改该对象的值,但它仍然是同一个对象。
因此,潜在的问题是识别与价值。数组由标识填充。您期望它按值填充。
解决方法:将字典添加到数组时复制字典,或者每次都从头开始创建一个全新的字典。
你每次都需要alloc
和init
数组,这样它就有了新的内存,然后它就不会添加相同的数组8次
你必须在循环中实例化字典:见代码
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];
}
我正在遍历一个数组,获取两个项目并将它们放入字典中,然后将它们添加到一个数组中,但它一直在为数组中的数字对象添加数组的最后一项,即使当我在循环中记录字典时,它具有正确的值。这是我的代码
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 次,而不是每个值,为什么?
提前感谢您的帮助。
请尝试:
for (TFHppleElement *element in nodesArray) {
[arrayOfDicts addObject:[NSDictionary dictionaryWithObjectsAndKeys:[element objectForKey:@"href"], @"href", [element text], @"name", nil]];
}
对象通过引用添加到数组。该数组不会创建字典的副本,它只是记录添加了哪个字典。您每次都向数组添加相同的字典 nameAndHrefDict
。所以数组认为自己多次持有同一个对象。
在每次迭代中,您都在更改该对象的值,但它仍然是同一个对象。
因此,潜在的问题是识别与价值。数组由标识填充。您期望它按值填充。
解决方法:将字典添加到数组时复制字典,或者每次都从头开始创建一个全新的字典。
你每次都需要alloc
和init
数组,这样它就有了新的内存,然后它就不会添加相同的数组8次
你必须在循环中实例化字典:见代码
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];
}