【问题标题】:NSString memory leak when parsing xml解析xml时NSString内存泄漏
【发布时间】:2011-01-19 10:08:16
【问题描述】:

我正在编写一个应用程序,它解析一些 xml 并使用以下关键方法创建元素名称及其值的字典:

- (void)parserDidStartDocument:(NSXMLParser *)parser{
    foundCharacters = [[NSMutableString alloc] init];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (accumulator) {
        [foundCharacters appendString:string];
    }
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if ([foundCharacters length] != 0) {

                    [parsedContent setObject:[foundCharacters copy] forKey:elementName];

                }
}

泄漏发生在“[parsedContent setObject:[foundCharacters copy] forKey:elementName];”上行,我想不出办法来克服这个问题。

任何见解将不胜感激。

编辑:

只有在多次调用要解析的请求时才会发生内存泄漏

我也尝试过“[[foundCharacters copy] autorelease]”,但没有 avale

【问题讨论】:

  • 你在哪里发布 foundCharacters。
  • 在上面的代码中,我在 dealloc 方法中发布它

标签: objective-c parsing memory-leaks nsstring


【解决方案1】:

“复制”方法被视为分配/初始化,你负责释放它们。见这里:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/copy

所以把你的代码改成:

NSString *copy = [foundCharacters copy];
[parsedContent setObject:copy forKey:elementName];
[copy release];

【讨论】:

  • 感谢 brindy 的快速回复,遗憾的是我在“NSString *copy = [foundCharacters copy];”上遇到了内存泄漏行
  • parsedContent 是一个 NSMutableDictionary,setObject 是它自带的默认方法
  • 在 NSString 上,copy 不会执行实际的复制,它仍然是指向另一个 NSString 内容的指针,因为 NSString 应该是不可变的。人们应该更多地使用 NSMutableString。
  • @mirage:是的,但是复制仍然保留原始对象,因此您仍然需要再次释放复制的对象。此外,这里复制的字符串实际上是一个 NSMutableString,因此复制创建了一个新对象。
  • 感谢您的努力,我终于设法解决了。原来上面的代码不是内存泄漏,而是上面的字典转换成对象的代码
【解决方案2】:

在您的parserDidStartDocument: 中分配/初始化一个可变字符串,但我没有看到您再次处理该字符串的代码。您需要再次释放字符串,例如在parserDidEndDocument: 方法中。

稍后报告内存泄漏可能是因为这是实际引用变量的最后一个位置。

【讨论】:

  • 嘿,谢谢你的帮助。我在我的 dealloc 方法中释放了字符串,但我把它移到了 parserDidEndDocument:,遗憾的是我仍然得到内存泄漏。是否有可能它是如何使用导致内存泄漏的字典?
  • 嗯,如果你同时应用我和我提到的 brindy,那么我在你发布的代码中看不到任何内存泄漏。
  • 如果我按照 brindy 的建议或我在上面发布的内容进行操作,我无法解决这个问题似乎真的很奇怪,我会遇到内存泄漏,并带有一个负责任的框架“NSCFString copywithzone:”。应用程序的工作方式是我解析为每个“对象”填充一个 nsmutabledictionary 的 xml,当我到达该对象的 xml 末尾时将该对象添加到一个数组中。当到达文档末尾时,我会发送一个通知,其中包含要处理为数据对象的数组。我想从解析过程中抽象出数据对象。
  • 感谢您的努力,我终于设法解决了。原来上面的代码不是内存泄漏,而是上面的字典转换成对象的代码
猜你喜欢
  • 2011-10-18
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2012-10-29
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多