【问题标题】:Memory leak using class member使用类成员的内存泄漏
【发布时间】:2011-10-05 13:40:44
【问题描述】:

在连接到 Web 服务时,我使用了一个名为“soapResults”的类成员。我使用解析器来解析 xml 结果(它是 Web 服务中的 json 结果)。

- (void) parser:(NSXMLParser *) parser
         didStartElement:(NSString *) elementName
         namespaceURI:(NSString *) namespaceURI
         qualifiedName:(NSString *) qName
         attributes:(NSDictionary *) attributeDict {
NSString *attName = [[NSString alloc]initWithFormat:@"%@Result",methodName];
if ([elementName isEqualToString:attName]) {        
    if (!soapResults) {         
        soapResults = [[NSMutableString alloc] init];   
    }       
    elementFound = YES;     
}

[attName release];
}   

现在soapResults 是一个retain 成员并在dealloc 中释放。我试图在连接失败/通过时释放它,但没有成功。我也尝试过不分配它,但结果是空的....任何帮助都会得到满足

编辑: 我还在解析器中遇到内存泄漏:

-(void)parser:(NSXMLParser *) parser 
foundCharacters:(NSString *)string {    
    if (elementFound) {
        [soapResults appendString: string];//Memory leak here
    }
}

【问题讨论】:

    标签: iphone objective-c web-services memory-leaks


    【解决方案1】:

    如果 soapResults 是一个保留属性,你应该改变

    soapResults = [[NSMutableString alloc] init];  
    

    self.soapResults = [NSMutableString string]; 
    

    这会释放旧值并保留新值,避免泄漏。

    【讨论】:

    • 我把代码改成了self.soapResults = [NSMutableString string];,内存泄漏还在……
    • 如果您在代码中的其他任何地方更改soapResults,您还应该使用self.soapResults 访问器。此外,如果您想在元素结束时记住字符串,您应该使用可变字符串 (NSString* s = [NSString stringWithString:soapResults]) 创建一个新字符串,以便在为下一个元素清空 NSMutableString 之前复制数据。
    【解决方案2】:

    你在这里分配soapResults = [[NSMutableString alloc] init];,但我没有看到任何释放。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2011-12-01
      • 2011-03-21
      • 2020-07-17
      • 2016-03-07
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多