NSXMLParser泄漏

时间:2009-10-21 05:46:48

标签: iphone memory-leaks nsxmlparser nsxml

我有以下泄漏的代码。仪器说它是rssParser对象泄漏。我“刷新”XML feed并运行块并且它泄漏....

file.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate> {

    NSXMLParser *rssParser;

}

file.m

NSData *data = [ NSURLConnection sendSynchronousRequest:request returningResponse: nil error: nil ];
    rssParser = [[NSXMLParser alloc] initWithData:data];
    [rssParser setDelegate:self];
    [rssParser setShouldProcessNamespaces:NO];
    [rssParser setShouldReportNamespacePrefixes:NO];
    [rssParser setShouldResolveExternalEntities:NO];
    [rssParser parse];
    [rssParser release];

泄漏图像......

alt text http://www.shipfinder.co.uk/images/memoryleak.png

4 个答案:

答案 0 :(得分:10)

Apple已经回复我,这是一个错误#6469143

看起来他们计划修复4.0

答案 1 :(得分:3)

最可能的原因是您的一个委托方法保留了解析器。您是否在委托方法中对解析器参数执行了任何操作?

每次刷新都会泄漏吗?

如果这是唯一使用rssParser的地方,为什么要把它变成ivar?如果你确实需要一个ivar,我不能强调总是为它们使用访问器并且永远不能直接访问它们的重要性。避免内存泄漏的唯一最佳方法是使用ivars的访问器。

此外,永远不要立即将其设置为其他东西(通常为零)。您上面发布的rssParser是一个等待发生的崩溃,因为您现在有一个指向潜在未分配内存的指针。

答案 2 :(得分:0)

似乎这是一个众所周知的问题。见NSURLConnection leaking。 但是,如果在初始化解析器泄漏停止之前设置以下内容:

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:URL];

答案 3 :(得分:0)

我刚刚使用this post中列出的方法解决了这个问题。

这是一种解决方法,但它确实有效。

另一方面,我发现如果你总是在设备上运行,而不是模拟器,那么仪器在Lion / Xcode 4.1中可靠运行。在模拟器上,似乎有一个时间的魔鬼附加到过程。

NSXMLParser实现似乎自然会泄露。我的应用程序中的其他地方还有另一个漏洞,我需要查看是否可以确定。这是一个异步调用,这个解决方案似乎不适用于此。