也许这是一个非常普遍和神经质的问题。我有一个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
答案 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
保存了指向对象的指针,因此这些指针也被“清理”了。
阻止这种情况的一种方法是使用NSDictionary
将NSArray
的副本添加到[durationArray addObject:[lDict copy]];
(如果它应该是可变的,则调用[lDict mutableCopy]
)。
如果要在循环中添加词典,只需在此循环内创建NSDictionary
而不是在外部。