代码之家  ›  专栏  ›  技术社区  ›  Lee Armstrong

nsxmlparser泄漏

  •  9
  • Lee Armstrong  · 技术社区  · 16 年前

    我有以下泄露的代码。仪器显示泄漏的是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];
    

    泄漏图像….

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

    4 回复  |  直到 14 年前
        1
  •  10
  •   Lee Armstrong    16 年前

    苹果已经找到我了,这是一个漏洞6469143

    看来他们打算修4.0版

        2
  •  3
  •   Rob Napier    16 年前

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

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

    如果这是唯一一个使用rssparser的地方,为什么要把它变成ivar?如果您确实需要一个IVAR,我就不能强调始终为它们使用访问器和从不直接访问它们是多么重要。避免内存泄漏的最好方法是为您的ivar使用访问器。

    另外,不要在没有立即将其设置为其他值(通常为零)的情况下释放某个对象。上面rssparer的发布是一个等待发生的崩溃,因为您现在有一个指向潜在未分配内存的指针。

        3
  •  0
  •   leviathan    16 年前

    这似乎是个众所周知的问题。看到这里 NSURLConnection leaking . 但是,如果在初始化分析程序之前设置了以下内容,则泄漏停止:

    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:URL];
    
        4
  •  0
  •   Chris Marshall    14 年前

    我只是使用中概述的方法修复了这个问题。 this post .

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

    另一个注意事项是,我发现,如果您总是在设备上运行Lion/Xcode 4.1,那么仪器在Lion/Xcode 4.1中工作可靠,而不是在模拟器上运行。在模拟器上,它似乎有一个魔鬼的时间附属于这个过程。

    nsxmlparser实现似乎是自然泄漏的。在我的应用程序的其他地方,这个库还有另一个漏洞,我需要看看是否能找到。这是一个异步调用,而这个解决方案似乎不适用于此。

    推荐文章