2011-04-04 67 views
1

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

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)的副作用,或者之后的原因是执行选择器。

感谢您的阅读,希望任何人都可以向我解释。

回答

2

您使用的是libxml2吗?我没有使用libxml2的,但是我很快用Google搜索,发现这个: http://xmlsoft.org/html/libxml-xmlreader.html

功能:xmlTextReaderConstValue

返回:字符串或NULL,如果没有可用的 。 结果将是 解除分配在下一个阅读() 操作

相比之下,与xmlTextReaderConstName

功能:xmlTextReaderConstName

返回:本地名称或NULL,如果没有可用的 ,字符串被释放 与读者

它可能是lib中的泄漏,或者由于结果似乎是延迟发布(或者完全不同,因为我没有第一手的经验)。程序是否因泄漏而崩溃?如果不是,那可能只是虚惊一场。

希望它有帮助。

+0

我确定这是重点。该应用程序不会因此泄漏而崩溃。感谢您的文档链接。 – TRD 2011-04-05 07:26:33

+0

不客气。很高兴我帮了忙。 :) – Altealice 2011-04-05 07:38:03