Xcode 在NSConcreteMatable中使用NSXMLParser的内存泄漏

Xcode 在NSConcreteMatable中使用NSXMLParser的内存泄漏,xcode,memory-leaks,nsxmlparser,Xcode,Memory Leaks,Nsxmlparser,我正在使用NSXMLParser,我得到一个指向NSConcreteMatable的内存泄漏,不管是什么: 从我的AppDelegate.m调用解析器时,泄漏发生在这行代码处: 我一直在寻找解决方案,但看不出我做错了什么。 这是我的密码。 非常感谢您的帮助。 lq /***XMLParser.h** #进口 @协议NSXMLParserDelegate; @接口XMLParser:NSObject { NSMutableArray*xmlArray; 布尔存储字符; 浮动xmlDataVer

我正在使用NSXMLParser,我得到一个指向NSConcreteMatable的内存泄漏,不管是什么:

从我的AppDelegate.m调用解析器时,泄漏发生在这行代码处:

我一直在寻找解决方案,但看不出我做错了什么。 这是我的密码。 非常感谢您的帮助。 lq

/***XMLParser.h**
#进口
@协议NSXMLParserDelegate;
@接口XMLParser:NSObject
{
NSMutableArray*xmlArray;
布尔存储字符;
浮动xmlDataVersion;
}
@属性(非原子,保留)NSMUTABLEARRY*xmlArray;
@属性(非原子)布尔存储字符;
@属性(非原子,赋值)浮点xmlDataVersion;
-(BOOL)parseXMLFileAtURL:(NSURL*)URL解析错误:(NSError**)错误;
@结束
//***XMLParser.m***
#导入“XMLParser.h”
@XMLParser的实现
@合成阵列;
@综合存储特征;
@综合xmlDataVersion;
-(BOOL)parseXMLFileAtURL:(NSURL*)URL parseError:(NSError**)错误{
布尔结果=是;
如果(xmlArray==nil){
//此数组保存从XML解析器didStartElement方法提取的行数据
xmlArray=[[NSMutableArray alloc]init];
}
[[NSURLCache sharedURLCache]设置内存容量:0];
[[NSURLCache sharedURLCache]设置磁盘容量:0];
NSXMLParser*parser=[[NSXMLParser alloc]initwithcontentsofull:URL];
if(解析器!=nil){
[解析器setDelegate:self];
[解析器setShouldProcessNamespaces:否];
[解析器setShouldReportNamespacePrefixes:否];
[[parser setShouldResolveExternalEntities:否];
}
[语法分析器解析];
if(parseError&&error){
*error=parseError;
结果=否;
}
[解析器发布];
返回结果;
}
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName属性:(NSDictionary*)attributeDict{
如果(qName){
elementName=qName;
}
//根据我的存储值检查XML数据的数据版本
if([elementName IsequalString:@“data”]){
NSUserDefaults*userDefaults=[NSUserDefaults standardUserDefaults];
self.xmlDataVersion=[[attributeDict objectForKey:@“version”]floatValue];
float-storedDataVersion=[userDefaults-floatForKey:kDataVersion];
if(self.xmlDataVersion)如果相同或更早的数据版本
[解析程序中止转换];
}
}
if([elementName IsequalString:@“FirstColumnName”]){
storingCharacters=是;
}else if([elementName IsequalString:@“SecondColumnName”]){
storingCharacters=是;
//…共16个元素
}
}
-(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串{
如果(存储字符){
[self.xmlArray addObject:string];
}
}
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{
如果(qName){
elementName=qName;
}
//->如果位于数据行的末尾,则保存对对象模型的更改
if([elementName IsequalString:@“行”]){
//->在采取任何操作之前,确保数据具有所需的元素数
if([self.xmlArray count]==16){
//…//根据数据值在SQLite存储中存储或更新数据
}
[self.xmlArray removeAllObjects];
}
storingCharacters=否;
}
-(无效)解除锁定{
[xmlArray发布];
[super dealoc];
}
//***AppDelegate.m***
#导入“XMLParser.h”
@实现AppDelegate
-(void)ApplicationIDFinishLaunching:(UIApplication*)应用程序{
NSURL*xmlURL=[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@“xml”类型的“FileName”;
NSError*parseError=nil;
XMLParser*xmlParse=[[XMLParser alloc]init];
[xmlParse-parseXMLFileAtURL:xmlURL-parseError:&parseError];
[xmlParse发布];
. . .

}/p>> p>这可能是苹果代码中的一个漏洞,因为基金会被报告为“负责任的图书馆”。您可能无能为力,但将错误报告给苹果。

< p>我在另一个帖子中找到了一个解决方案:

使用:

而不是:

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];

泄漏消失了。

没有看到实际解析器的代码,很难指出错误。Williham,我正在添加其余的解析方法以显示更完整的图片。谢谢。LQ从我所看到的来看,这确实看起来像是苹果代码中的泄漏。如果它只发生一次,不管你解析了多少文件,我都会不必担心。但是,我有一个与您类似的设置(
NSXMLParser
+CoreData),在解析时,我从泄漏中得到了一张干净的账单。Williham,那么我这里肯定有一些与您不同的东西?嗯,显然,您有泄漏。;)您正在运行Xcode 4吗?如果是,您尝试过分析吗?(从产品菜单中)我曾看到其他帖子将此漏洞归咎于苹果代码中的一个bug,但我确实通过使用我上面发布的解决方案消除了漏洞。
NSData * dataXml = [[NSData alloc] initWithContentsOfURL:URL];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dataXml];
[dataXml release];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];