【问题标题】:memory leak when parsing data解析数据时内存泄漏
【发布时间】:2011-07-14 03:04:10
【问题描述】:

我正在尝试解析一个 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 是 nsmutablearray,我在 viewdidload 函数中分配并在 releaseMemory 中释放。我浏览了 NScopy 文件,它说当我们使用副本时,所有权被转移。我正在释放我所有的数组,为什么它仍然会导致问题??

请帮忙。 谢谢

【问题讨论】:

  • 我错过了清除 didendelement 中的行我没有释放 nsdictionary(tdata)。如果我释放它只会崩溃。
  • 请将代码粘贴进去并去掉截图(难以阅读)
  • 考虑转换为 ARC,这些问题就会消失。

标签: iphone ios memory-leaks


【解决方案1】:

您泄漏的原因是因为 tData 正在执行您告诉它的操作,并返回一个副本。在下一行对 tData 调用 autorelease 会自动释放原始 tData,这将导致过度释放。您需要将该行更改为此 [tInState addObject:[[tData copy] autorelease]]; 并删除下一行的 autorelease 调用。

【讨论】:

    【解决方案2】:

    在第 81 行,您正在创建 tData 的副本,但没有释放它,因此它正在泄漏。不要在addObject 调用中创建副本,而是将其分配给一个变量,然后将其传递给addObject,然后释放它。

    id temp = [tData copy];
    [tInState addObject:temp];
    [temp release];
    

    另外,我假设[tData autorelease] 实际上是为了发布副本。如果是这样,那就没有必要了。

    【讨论】:

    • @Jonathan - 当然,但如果您知道不再需要它,将其放入自动释放池没有多大意义。
    • 是的,但它的代码更短、更简洁,并且可以让您跳过创建临时代码。 -autorelease 的开销极低——避免它往往是过早的优化。
    • 谢谢它的工作。那么当我们复制它时应该进入任何 id 吗??
    • 您要么必须将副本分配给可以调用 release 的变量,要么正如@Jonathan 指出的那样,使用更短、更简洁的[[tData copy] autorelease] 模式。
    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2012-02-12
    • 2023-03-24
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多