ios - NSXMLParser 的内存泄漏

标签 ios objective-c nsxmlparser

我正在使用 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 方法中释放了解析器委托(delegate),并通过调用释放了它的内存:-

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

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

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

最佳答案

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

最好的解决方案是确保 xmlParser 是一个属性(在实现文件中声明的私有(private)属性)并且您可以通过以下方式调用它的 setter:

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

dealloc 中:

self.xmlParser = nil;

删除:

[xmlParser dealloc];

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

关于ios - NSXMLParser 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35131469/

相关文章:

ios - 导致黑屏的 SWRevealViewController 层次结构

ios - 不受我控制的应用程序是否可以访问存储在我帐户中的 iCloud/CloudKit 数据?

ios - UIScrollView : Not filling width of container? 内嵌套的 UIStackViews

objective-c - 如何处理NSXMLParser中另一个标签内的标签

ios - 无法在iOS中使用NSXMLParser解析XML文件

ios - 一个新的 TableView 位于另一个 TableView 之后

ios - performSegueWithIdentifier 和 viewDidLoad

ios - iOS8中的自定义GIF键盘

objective-c - 我必须在 Objective C 中使用点符号来访问结构值吗?

xml - 在 Swift 中使用 NSXMLParser 时访问元素的值