我正在尝试解析一个xml文件。我正在创建一个字典数组,然后使用这些创建的数组我创建数组的数组。当我将nsdictionary复制到数组中时,我有内存泄漏。可以任何人请帮助!! 感谢
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if(parseMode == 1){
// NSLog(@"found this start tag: %@", elementName);
if ([elementName isEqualToString:@"Group"]) {
[tInState removeAllObjects];
}
else if ([elementName isEqualToString:@"State_Name"]) {
tData = [[NSMutableDictionary alloc] init];
xmlItem = 0;
}
else if ([elementName isEqualToString:@"T_Name"]) {
xmlItem = 1;
}
else if ([elementName isEqualToString:@"T_Address"]) {
xmlItem = 2;
}
else if ([elementName isEqualToString:@"T_Ph"]) {
xmlItem = 3;
}
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if (parseMode == 1) {
// NSLog(@"found this end tag: %@", elementName);
if([elementName isEqualToString:@"T_Info"]) {
[tInState addObject:[tData copy]];
[tData autorelease];
}
else if ([elementName isEqualToString:@"Group"]) {
[tlist addObject:tInState];
}
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if (parseMode == 0) {
[self addToStateList:string];
}
else if (parseMode == 1) {
// NSLog(@"found this character: %@", string);
switch (xmlItem) {
case 0:
[tData setValue:string forKey:@"State_Name"];
break;
case 1:
[tData setValue:string forKey:@"T_Name"];
break;
case 2:
[tData setValue:string forKey:@"T_Address"];
break;
case 3:
[tData setValue:string forKey:@"T_Ph"];
break;
default:
break;
}
}
}
这里是tInState,tInState是我在viewdidload函数中分配并在releaseMemory中释放的nsmutablearray。我查看了NScopy文档,它说我们在使用副本时会转移所有权。我发布了所有的数组,为什么它仍然会导致问题?
请帮助解决这个问题。 感谢
答案 0 :(得分:1)
泄密的原因是因为tData正在执行您所说的操作,并返回副本。在下一行的tData上调用autorelease是自动释放原始tData,这将导致过度释放。您需要将该行更改为此[tInState addObject:[[tData copy] autorelease]];
并删除下一行的自动释放调用。
答案 1 :(得分:0)
在第81行,您正在创建tData的副本,但不会释放它,因此它正在泄漏。不是在addObject
调用中创建副本,而是将其分配给变量,然后将其传递给addObject
,然后将其释放。
id temp = [tData copy];
[tInState addObject:temp];
[temp release];
另外,我假设[tData autorelease]
实际上是要释放副本。如果是这样,那就没必要了。