为什么我用xmlTextReaderConstValue会出现内存泄漏?

时间:2011-04-04 13:42:49

标签: objective-c cocoa ios

我正在编写自己的包装类来解析XML数据。通常我使用泄漏性能工具通过忘记释放分配的内存来检测怀疑行为。 这时我发现下面的代码(第一行被工具标记)给我带来了巨大的内存泄漏(XML数据文件变得越大,泄漏越多)。 以下部分用于接收节点内的文本。

NSString *currentTagValue = [NSString stringWithCString:(char *)xmlTextReaderConstValue(XMLReader) encoding:NSUTF8StringEncoding];
SEL selector = NSSelectorFromString([NSString stringWithFormat:@"set%@:", [currentTag capitalizedString]]);
[currentItem performSelector:selector withObject:currentTagValue];

如果我添加

[currentTagValue release]

内存泄漏消失了。

这对我来说很奇怪,因为我没有手动为NSString分配内存。这就是我认为它会被自动释放的原因。 如果我将上层代码示例与负责获取节点名称的部分进行比较,则整个情况变得更加奇怪。

NSString *currentTagName = [NSString stringWithCString:(char *)xmlTextReaderConstName(XMLReader) encoding:NSUTF8StringEncoding];
SEL selector = NSSelectorFromString([NSString stringWithFormat:@"set%@:", [currentTagName capitalizedString]]);

这里我不必添加手动版本,一切正常,我没有内存泄漏。 我不确定我描述的问题是否是xml的副作用... ConstValue函数(工作部分使用xml ... ConstName)或者原因是之后执行的选择器。

感谢阅读,希望有人能向我解释。

1 个答案:

答案 0 :(得分:2)

您使用的是libxml2吗?我还没有使用过libxml2,但我快速搜索了一下,发现了这个: http://xmlsoft.org/html/libxml-xmlreader.html

  

功能:xmlTextReaderConstValue

     

返回:字符串,否则返回NULL   可用。 结果将是   在下一个Read()上解除分配   操作

将其与xmlTextReaderConstName

进行比较
  

功能:xmlTextReaderConstName

     

返回:本地名称,否则返回NULL   可用,该字符串已取消分配   与读者

它可能是lib中的泄漏,或者是虚假警报,因为结果似乎是延迟发布(或者完全不同的东西,因为我没有第一手经验说不然)。该程序是否因泄漏而崩溃?如果不是,也许这只是一个误报。

希望它有所帮助。