NSXMLParser的内存泄漏

时间:2011-05-16 11:33:25

标签: objective-c memory-leaks cocos2d-iphone nsxmlparser

我正在运行cocos2d与levelSVG,一个来自Sapus Media的SVG解析系统。
我正在使用解析系统,它按预期工作,但我在与NSXMLParser相关的内存泄漏方面存在一些问题。
内存泄漏会在5分钟的时间内使fps保持一致的下降,并且在此时间范围结束时以12fps的速度渲染应用程序。 我已经删除了所有粒子系统和其他可能泄漏的物体,泄漏仍然存在。

运行内存泄漏工具
检测到3个泄漏对象:
GeneralBlock-512
GeneralBlock-512
NSConcreteMapTable

他们链接到:

*

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];  

        [parser setDelegate:self];
        [parser setShouldProcessNamespaces:NO];
        [parser setShouldReportNamespacePrefixes:NO];
        [parser setShouldResolveExternalEntities:NO];
        [parser parse];

        NSError *parseError = [parser parserError];
        if(parseError) {
            SVGLOG(@"Error parsing SVG file: %@", parseError);
        }

        [parser release];

如您所见,解析完成后将释放该对象。

驱使我疯狂,有谁知道发生了什么?

1 个答案:

答案 0 :(得分:0)

好的,经过一些研究后,我发现在使用上述URL方法时NSXMLParser中存在一个错误。

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]

将此更改为:

NSData *xml = [NSData dataWithContentsOfURL:url];            
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xml];

这解决了内存泄漏问题,但仍未考虑到时间范围内fps的一致下降。 然后我发现我的特定类的内存分配,CCFollow在内存泄漏工具上一直在增加加班时间。

然后检查了代码,我在重复的tick更新方法中运行了无限的CCAction-CCFollow。这是内存消耗的来源。 将其从tick更新方法中删除并将其移至初始化方法可解决此问题。