gpt4 book ai didi

iphone - 内存管理如何修复泄漏

转载 作者:行者123 更新时间:2023-11-28 18:00:38 26 4
gpt4 key购买 nike

我正在构建一个统计监控应用程序,我正在使用 XML 解析器来检索我的数据。经过大量研究,学习和阅读obj-c的内存管理和retainCount等,但我仍然遇到Instruments中的内存泄漏。

    for(int counter = 0; counter < [resultElement childCount]; counter++) { //Loop trough the childs
//Instruments Leaks tells me that I have 75% leaks here
[entryItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];
}

//Instruments Leaks tells me that I have 25% leaks here
[totalEntries addObject:[entryItem copy]]; //Copy it into the MutableArray

XML 解析器发生内存泄漏,但我不知道如何修复泄漏。

- (NSString *)stringValue {
if (_node->type == XML_TEXT_NODE || _node->type == XML_CDATA_SECTION_NODE){
return [NSString stringWithUTF8String:(const char *)_node->content]; //16.7% leaking
}

if (_node->type == XML_ATTRIBUTE_NODE){
return [NSString stringWithUTF8String:(const char *)_node->children->content]; //50.0% leaking
}

NSMutableString *theStringValue = [[[NSMutableString alloc] init] autorelease];
for (CXMLNode *child in [self children]) {
[theStringValue appendString:[child stringValue]]; //33.3% leaking
}

return theStringValue;

最佳答案

在行中

[totalEntries addObject:[entryItem copy]];

您复制该对象(因此您的新对象的保留计数为 1),并将其添加到 totalEntries,这再次增加了保留计数。你错过了一个版本。应该是

[totalEntries addObject:[[entryItem copy] autorelease]];

NSObject* copiedItem = [entryItem copy];
[totalEntries addObject:copiedItem];
[copiedItem release];

您可以使用静态分析器对此进行一些深入了解。随着 ARC 的出现,您很快就完全不必担心这一点(尽管对它有所了解还是很有用的)。

关于iphone - 内存管理如何修复泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7804942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com