【问题标题】:Removing all data from NSMutableDictionary从 NSMutableDictionary 中删除所有数据
【发布时间】:2013-03-27 14:13:51
【问题描述】:

也许这是一个非常常见和书呆子的问题。我有一个 NSMutableDictionary,我正在向其中添加一些对象,然后将字典添加到 NSMutableArray。将字典添加到数组后,我将删除字典的所有对象并将其设置为 nil,这将从添加字典的数组中删除数据。我做错了什么导致数组丢失数据??

NSMutableDictionary *lDict = [[NSMutableDictionary alloc]init];
[lDict setObject:lDate forKey:@"date"];
[lDict setObject:presentationId forKey:@"pptId"];
[lDict setObject:presentationName forKey:@"PresentationName"];
[lDict setObject:presentationDesc forKey:@"PresentationDesc"];
[lDict setObject:presentationThumb forKey:@"presentationThumb"];
[lDict setObject:postCallRowId forKey:@"postCallId"];
[lDict setObject:userReaction forKey:@"userReaction"];
[lDict setObject:appDel.gRegion forKey:@"Region"];
[lDict setObject:@"Presentation" forKey:@"ContentType"];

[durationArray addObject:lDict];

 //here I am having data in array

[lDict removeAllObjects];
lDict=nil;

//here I lost data in array also

【问题讨论】:

  • 丢失数据是什么意思? dict 保留您在那里设置的值,并且数组将保留字典而不是其中的值。如果你清理字典,数组指向一个空字典。
  • 如果我必须在将字典添加到数组后释放它,我该怎么办?
  • 如果您在非弧中,只需释放字典,或者像您一样将其设为 nil 但不发送 removeAllObjects。
  • 虽然所有答案都同样可以接受,但我只能接受一个。

标签: ios ipad nsmutablearray nsmutabledictionary


【解决方案1】:

这样的事情怎么样:

NSMutableDictionary *lDict = [[NSMutableDictionary alloc]init];

[lDict setObject:lDate forKey:@"date"];
[lDict setObject:presentationId forKey:@"pptId"];
[lDict setObject:presentationName forKey:@"PresentationName"];
[lDict setObject:presentationDesc forKey:@"PresentationDesc"];
[lDict setObject:presentationThumb forKey:@"presentationThumb"];
[lDict setObject:postCallRowId forKey:@"postCallId"];
[lDict setObject:userReaction forKey:@"userReaction"];
[lDict setObject:appDel.gRegion forKey:@"Region"];
[lDict setObject:@"Presentation" forKey:@"ContentType"];

//make a new dictionary and save it
[durationArray addObject:[[NSDictionary alloc] initWithDictionary:lDict]];

[lDict removeAllObjects];
lDict=nil;

在从可变字典中删除所有对象之前,创建一个具有相同内容的新字典并将其保存到数组中。

通过创建新字典,您仍然可以在原始字典中维护键/值对设置,而不仅仅是保存值。

【讨论】:

    【解决方案2】:

    自上而下,数组包含一个指向字典的指针,然后它包含指向您添加的所有对象的指针。将字典添加到数组并不意味着它们的数组具有指向各个对象的指针——数组只知道字典,只有字典知道对象。当您从字典中删除所有对象时,数组看不到任何更改。就它而言,它仍然有一个指向字典的指针。

    如果您尝试将字典中的对象添加到数组中,那么您应该遍历字典并将各个对象一个接一个地添加到数组中。

     for (NSString *key in lDict)
     {
          [durationArray addObject:[lDict objectForKey:key]];
     }
    
     [lDict removeAllObjects];
     lDict=nil;
    

    此时您的数组中应该仍有对象。

    如果你想一次性全部添加,可以试试:

     [durationArray addObjectsFromArray:[lDict allValues]];
     [lDict removeAllObjects];
     lDict = nil;
    

    【讨论】:

    • 我不能一个一个地添加对象。我必须将字典添加到数组中。这样,有没有办法从字典中释放对象而不是数组?
    • 好的,请看我回复中的第二个代码块——您可以将lDict 中的所有对象一行添加到数组中
    【解决方案3】:

    清理NSMutableDictionary 是否有特定原因?正如其他人所提到的,NSArray 包含指向对象的指针,因此这些也被“清理”了。

    防止这种情况的一种方法是使用[durationArray addObject:[lDict copy]];NSDictionary 的副本添加到NSArray(如果它应该是可变的,则调用[lDict mutableCopy])。 如果您在循环中添加字典,只需在此循环内部而不是外部创建 NSDictionary

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2018-11-20
      • 2011-08-19
      • 2014-08-16
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多