9

我有以下泄漏的代码。Instruments 说泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了这个块并且它泄漏了......

文件.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate> {

    NSXMLParser *rssParser;

}

文件.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];

泄漏的图像......

替代文字 http://www.shipfinder.co.uk/images/memoryleak.png

4

4 回答 4

10

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

看起来他们计划修复 4.0

于 2010-01-22T06:44:07.117 回答
3

最可能的原因是您的委托方法之一保留了解析器。你在委托方法中对你的解析器参数做了什么吗?

每次刷新都会泄漏吗?

如果这是唯一使用 rssParser 的地方,你为什么要把它变成 ivar?如果您确实需要一个 ivar,我怎么强调始终为它们使用访问器而不是直接访问它们是多么重要。避免内存泄漏的唯一最佳方法是为您的 ivars 使用访问器。

此外,不要在没有立即将其设置为其他内容(通常为 nil)的情况下发布某些内容。您在上面发布的 rssParser 是一个等待发生的崩溃,因为您现在有一个指向可能未分配的内存的指针。

于 2009-10-21T07:00:08.077 回答
0

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

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:URL];
于 2009-11-09T17:50:50.590 回答
0

我刚刚通过使用这篇文章中概述的方法解决了这个问题。

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

另一方面,我发现 Instruments 可以在 Lion/Xcode 4.1 中可靠地工作,如果你总是在设备上运行它,而不是模拟器。在模拟器上,它似乎有一个时间附在过程中。

NSXMLParser 实现似乎自然而然地泄漏了。我的应用程序中其他地方的这个库还有另一个泄漏,我需要看看我是否可以确定。那是一个异步调用,这个解决方案似乎对此不起作用。

于 2011-09-19T12:20:35.117 回答