【问题标题】:NSMutableArray adds same NSDictionary multiple timesNSMutableArray 多次添加相同的 NSDictionary
【发布时间】:2015-06-20 23:48:00
【问题描述】:

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

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

发生了什么?

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

提前感谢您的帮助。

【问题讨论】:

  • 您多次添加相同的字典。 当然你会得到多份!

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


【解决方案1】:

请尝试:

 for (TFHppleElement *element in nodesArray) {

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

【讨论】:

  • 很好用吗?但为什么我以前不这样做?,我每次都在循环中尝试 alloc 和 init ,这也使它工作但我不知道为什么?
  • 你正在用相同的键覆盖以前的对象。
  • 对,但是为什么它会将该对象添加两三次呢?当它被覆盖时它不是消失了吗?
  • 我不应该使用“覆盖”这个词。您添加的所有对象仍在数组中,但是因为当您循环遍历 TFHppleElement 以及循环结束后,指向元素项的指针会发生变化。所有的指针都指向你的最后一个元素。
  • 解决方案实际上是让您的 arrayOfDicts 的每个项目都包含一个唯一的 NSDictionary 实例。这就是为什么当您执行 alloc init 时,它会起作用。
【解决方案2】:

对象通过引用添加到数组中。该数组不会创建字典的副本,它只是记录已添加的字典。您每次都将相同的字典 nameAndHrefDict 添加到数组中。所以数组认为自己多次持有同一个对象。

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

因此,根本问题是识别与价值。数组由身份填充。您期望它按值填充。

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

【讨论】:

    【解决方案3】:

    你需要每次allocinit这个数组,这样它就有新的内存,然后它就不会添加同一个数组8次了

    【讨论】:

      【解决方案4】:

      你必须在循环中实例化字典:见代码

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        相关资源
        最近更新 更多