4

也许这是一个非常常见和书呆子的问题。我有一个 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
4

3 回答 3

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;

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

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

于 2013-03-27T14:29:17.110 回答
2

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

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

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

 [lDict removeAllObjects];
 lDict=nil;

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

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

 [durationArray addObjectsFromArray:[lDict allValues]];
 [lDict removeAllObjects];
 lDict = nil;
于 2013-03-27T14:19:08.927 回答
0

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

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

于 2013-03-27T14:24:51.907 回答