2009-10-21 71 views
9

我有以下代码泄漏。仪器说它是rssParser对象泄漏。 I “刷新” XML进料和它运行块和它泄漏....NSXMLParser泄漏

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

+1

请注意,三个setShould *语句全部默认为NO,因此您可以从代码中删除这些语句。 – 2009-10-21 17:34:20

回答

10

苹果已经回来给我,这是一个bug#6469143

看起来他们计划定为4.0

+0

你有没有收到苹果公司关于这个Bug的回复? – 2010-06-30 14:56:48

+2

我得到了同样的泄漏,这个泄漏修复在4.0 – kiri 2010-07-01 19:23:17

+1

嗯,我仍然看到它在iOS4 SDK中。我还没有下载最新的 – philsquared 2010-07-29 13:11:29

3

最可能的原因是,你的委托方法之一保留解析器。你是否在委托方法中使用了解析器参数?

每次刷新时都会发生泄漏吗?

如果这是唯一使用rssParser的地方,那你为什么要把它变成伊娃?如果你确实需要一个伊娃,我总是不能强调它总是使用访问器对他们来说是多么重要,并且决不会直接访问它们。避免内存泄漏的最好方法是为你的ivars使用访问器。

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

+0

是的,我每次都得到泄漏,我已经做出了你所描述的改变,因为它不应该是伊娃。仍然泄漏! – 2009-10-21 19:17:18

+0

你有Xcode 3.2(来自SnowLeopard)吗?构建和分析工具非常适合寻找简单的泄漏。 – 2009-10-22 00:13:17

+0

是的,我已经试过了。 – 2009-10-22 03:12:37

0

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

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

其实苹果回到我身边,这个问题已经记录为6469143.不知道他们什么时候会修复它。仍然泄漏改变你的做法! – 2009-11-11 13:28:50

0

我只是通过使用this post中列出的方法来解决这个问题。

这是一个解决方法,但它的工作原理。

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

NSXMLParser实现似乎自然会泄漏。在我的应用程序的其他地方有另一个泄漏,我需要看看我是否可以确定。这是一个异乎寻常的呼吁,而这个解决方案似乎不适用于此。