繁体   English   中英

使用TouchXML解析XML时发生内存泄漏

[英]Memory leak while parsing XML using TouchXML

我正在使用TouchXML解析XML。 当我在“配置文件”模式下运行相同的文件时。 我可以看到内存泄漏。 如何解决此问题?

-(NSMutableArray *) grabXML:(NSData *)xmlData andQuery:(NSString *)query {  
    NSMutableArray *blogEntries = [[[NSMutableArray alloc] init] autorelease];  
    CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithData:xmlData options:0 error:nil] autorelease];
    NSArray *resultNodes = [rssParser nodesForXPath:query error:nil];
    for (CXMLElement *resultElement in resultNodes) {
        NSMutableDictionary *blogItem = [[NSMutableDictionary alloc] init];
        int counter;
        for(counter = 0; counter < [resultElement childCount]; counter++) {
            [blogItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];
        }
        for( int i = 0; i < [[resultElement attributes] count]; i++) {
            CXMLNode *node = [[resultElement attributes] objectAtIndex:i];
            [blogItem setObject:[[resultElement attributeForName:[node name]] stringValue] forKey:[node name]];
        }
        [blogEntries addObject:[blogItem copy]];
        [blogItem release];
    }
    return [blogEntries copy];
}

我以下面提到的格式调用上述方法。

NSMutableArray *arr = [[self grabXML:responseData andQuery:@"//wsCheneliereResult"] autorelease];
[blogEntries addObject:[blogItem copy]];

这是您的错误:您无需复制blogItemaddObject:实际上将retain其参数,以便您可以安全地调用[blogItem release]; 之后。

而且,您很可能也不应该return [blogEntries copy] ,而仅返回blogEntries :这是一种常见的编程习惯,即名称不包含“ copy”或“ create”的方法返回自动释放的值,例如您不需要释放当您完成对它们的操作时。

综上所述,我将选择:

-(NSMutableArray *) grabXML:(NSData *)xmlData andQuery:(NSString *)query {  
    NSMutableArray *blogEntries = [[[NSMutableArray alloc] init] autorelease];  
    CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithData:xmlData options:0 error:nil] autorelease];
    NSArray *resultNodes = [rssParser nodesForXPath:query error:nil];
    for (CXMLElement *resultElement in resultNodes) {
        NSMutableDictionary *blogItem = [[NSMutableDictionary alloc] init];
        int counter;
        for(counter = 0; counter < [resultElement childCount]; counter++) {
            [blogItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];
        }
        for( int i = 0; i < [[resultElement attributes] count]; i++) {
            CXMLNode *node = [[resultElement attributes] objectAtIndex:i];
            [blogItem setObject:[[resultElement attributeForName:[node name]] stringValue] forKey:[node name]];
        }
        [blogEntries addObject:blogItem];
        [blogItem release];
    }
    return blogEntries;
}

NSMutableArray *arr = [self grabXML:responseData andQuery:@"//wsCheneliereResult"];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM