【问题标题】:Memory Leaks with NSXMLParserNSXMLParser 的内存泄漏
【发布时间】:2016-05-09 23:01:40
【问题描述】:

我正在使用 NSXMLParser 并通过调用以下方法解析同一类中的多个 .xml 文件。

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];

NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"Accessory" ofType:@"xml"];
NSData *xmlData = [NSData dataWithContentsOfFile:xmlPath];

xmlParser = [[NSXMLParser alloc] initWithData:xmlData];
xmlParser.delegate=self;
[xmlParser parse];

我也在 dealloc 方法中释放了解析器委托,并通过调用释放了它的内存:-

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

- (void)dealloc
{
    [xmlParser dealloc];
    [super dealloc];
}

连续解析两三个xml文件后,应用程序仍然崩溃。 我在这里缺少什么。任何建议,将不胜感激。提前致谢。

【问题讨论】:

  • 仪器和泄漏怎么说?
  • 您的应用程序崩溃时给出什么原因?
  • 感谢您的回复!!我已经尝试过使用仪器,它显示了分配正在填写 xml 文件的字典以在我的应用程序中进一步使用的警报。我还使用 autorelease 进行内存释放。但仍然遇到同样的问题。

标签: ios objective-c nsxmlparser


【解决方案1】:

您不能使用 ARC,因为调用 [super dealloc] 会导致编译器错误,所以我认为问题是因为您在存储 xmlParser 时没有使用 setter。如果该代码被多次调用,那么先前持有的对 NSXMLParser 对象的引用将被泄露,因为您只需放弃它们。

最好的解决方案是确保xmlParser 是一个属性(在实现文件中声明的私有属性)并且您调用它的设置器:

self.xmlParser = [[[NSXMLParser alloc] initWithData:xmlData] autorelease];

这个在dealloc:

self.xmlParser = nil;

删除:

[xmlParser dealloc];

自动生成的设置器将确保以前的引用被安全释放,从而阻止泄漏。

【讨论】:

    【解决方案2】:

    您的项目已启用 ARC,则无需显式调用 [xmlParser dealloc]。只需致电:

    [xmlParser setDelegate:nil];
    xmlParser = nil;
    

    从 dealloc 中删除这一行。

    [xmlParser dealloc];
    

    【讨论】:

      【解决方案3】:

      您正在使用+[NSData dataWithContentsOfFile:] 一次将整个文件加载到 RAM 中。除此之外,您获得的 NSData 实例是自动发布的。 IE。完成后它可能会挂起。

      所以你最好改用initWithContentsOfFile:。为了进一步节省内存,您可以通过传递选项NSDataReadingMappedAlwaysNSDataReadingMappedIfSafe 来映射文件。

      或者尝试对文件内容使用流。所以用-[NSXMLParser initWithStream:]创建你的解析器。

      我们不知道您在委托中创建了哪些对象。他们可能会吃掉所有的内存。

      【讨论】:

        猜你喜欢
        • 2011-02-09
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 2010-12-24
        • 2011-07-03
        • 1970-01-01
        相关资源
        最近更新 更多