objective-c - 为什么我的 xmlTextReaderConstValue 会发生内存泄漏?

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

感谢阅读,希望有人能给我解释一下。

最佳答案

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

Function: xmlTextReaderConstValue

Returns: the string or NULL if not available. The result will be deallocated on the next Read() operation.

将其与 xmlTextReaderConstName 进行比较

Function: xmlTextReaderConstName

Returns: the local name or NULL if not available, the string is deallocated with the reader.

这可能是库中的泄漏,或者是误报,因为结果似乎是延迟发布(或者是完全不同的东西,因为我没有第一手经验,所以不能这样说)。程序是否因泄漏而崩溃?如果不是,则可能只是误报。

希望对您有所帮助。

关于objective-c - 为什么我的 xmlTextReaderConstValue 会发生内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5539360/

相关文章:

objective-c - 无法识别同一 ViewController 中不同 View 上的 TextField

Objective-c 枚举类

ios - 实现 NSURLConnection 委托(delegate)

macos - 为什么 NSTableView 可能会重绘滚动时的每个单元格?

objective-c - 如何将图像编码为字符串格式?

c++ - NSMutableArray 与堆栈

objective-c - NSOutlineView 的拖放方法未被调用

ios - NSUserDefaults 在同步时崩溃

ios - FIRApp 配置失败 w/"Configure Durable Deep Link fails"

ios - 如何从 NSString 中搜索并删除转义字符?