【问题标题】:XMLParser leak instrument leakXMLParser 泄漏仪器泄漏
【发布时间】:2011-11-02 19:53:04
【问题描述】:
NSURL *url = [[NSURL alloc] initWithString:@"http://www.someurl.com/sample.xml"];
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[url release];

XMLParser *parser = [[XMLParser alloc] initXMLParser];        //50.0%


[xmlParser setDelegate:parser];
parser = nil;
[parser release];

[xmlParser parse];                                           //50.0%
[xmlParser release];

这是我的解析代码,泄漏工具显示泄漏。我真的不知道出了什么问题或如何解决这个问题。有什么建议?

【问题讨论】:

    标签: iphone memory-leaks nsxmlparser


    【解决方案1】:

    我在使用 NSXMLParser 时也遇到过类似的问题,但找到了解决内存泄漏的简单方法。

    而不是做

    xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    

    执行以下操作

    NSData *xmlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
    xmlParser = [[NSXMLParser alloc] initWithData:xmlData];
    

    我能够摆脱我的内存泄漏

    【讨论】:

      【解决方案2】:

      有一个 similar post here 关于解析器中的泄漏。我也有这个问题。这很烦人,但它不是一个巨大的泄漏,所以我不太担心它。将查看 iOS 5 是否修复了该问题(如果确实是已知泄漏)

      编辑:我现在很想看看我是否犯了上面的错误!

      【讨论】:

      • 所以你建议我把它留给蜜蜂。让我的应用程序泄漏?
      【解决方案3】:
      parser = nil;
      [parser release];
      

      ...这并不像你认为的那样。假设parser 是一个属性,那么self.parser = nilparser = nil 会做非常不同的事情。前者会调用parser setter 方法,该方法会释放旧值并将属性设置为nil。后者只是将指针从当前位置更改为 nil。

      通过将指针设置为 nil,您丢失了对该对象的引用,因此您立即泄露了之前分配给它的对象 - 您基本上是在尝试释放一个 nil 对象。您需要删除nil 调用,或将其放在release 之后(见下文)。

      您可能正在考虑设置一个指向nil的指针您发布它之后,以防止您将来尝试访问它时出现问题。

      这里还有一些其他问题可以帮助提供一些背景信息:

      release Vs nil -- Best Practice

      Difference between release and release then set to nil

      【讨论】:

      • 我会将其重写为单行:[parser release], parser = nil;。尽管它是本地范围,但实际上并不需要将指针设置为 nil
      • 确实 - 就个人而言,我只将属性设置为 nil,而不是局部变量。而且,正如西蒙在他的回答中所暗示的那样,这不会修复解析器本身的泄漏!
      猜你喜欢
      • 2012-07-06
      • 2011-07-11
      • 1970-01-01
      • 2011-10-14
      • 2011-06-18
      • 2023-03-18
      • 2012-01-23
      • 2011-02-15
      相关资源
      最近更新 更多