解析数据时发生内存泄漏

时间:2011-07-14 03:04:11

标签: iphone ios memory-leaks

我正在尝试解析一个xml文件。我正在创建一个字典数组,然后使用这些创建的数组我创建数组的数组。当我将nsdictionary复制到数组中时,我有内存泄漏。可以任何人请帮助!! 感谢

enter image description here

- (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文档,它说我们在使用副本时会转移所有权。我发布了所有的数组,为什么它仍然会导致问题?

请帮助解决这个问题。 感谢

2 个答案:

答案 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]实际上是要释放副本。如果是这样,那就没必要了。