从NSMutableDictionary中删除所有数据

时间:2013-03-27 14:13:52

标签: ios ipad nsmutablearray nsmutabledictionary

也许这是一个非常普遍和神经质的问题。我有一个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

3 个答案:

答案 0 :(得分:8)

这样的事情怎么样:

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;

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

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

答案 1 :(得分:2)

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

如果您要做的是将字典中的对象添加到数组中,那么您应该遍历字典并逐个将各个对象添加到数组中。

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

 [lDict removeAllObjects];
 lDict=nil;

此时你仍然应该拥有数组中的对象。

如果您想一次性添加所有内容,可以尝试:

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

答案 2 :(得分:0)

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

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