我正在编写自己的包装类来解析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)或者原因是之后执行的选择器。
感谢阅读,希望有人能向我解释。
答案 0 :(得分:2)
您使用的是libxml2吗?我还没有使用过libxml2,但我快速搜索了一下,发现了这个: http://xmlsoft.org/html/libxml-xmlreader.html
功能:xmlTextReaderConstValue
返回:字符串,否则返回NULL 可用。 结果将是 在下一个Read()上解除分配 操作强>
将其与xmlTextReaderConstName
进行比较功能:xmlTextReaderConstName
返回:本地名称,否则返回NULL 可用,该字符串已取消分配 与读者。
它可能是lib中的泄漏,或者是虚假警报,因为结果似乎是延迟发布(或者完全不同的东西,因为我没有第一手经验说不然)。该程序是否因泄漏而崩溃?如果不是,也许这只是一个误报。
希望它有所帮助。