内存泄漏与NSXMLParser

问题描述:

我正在写一个应用程序,它使用NSXMLParser来解析来自网站的信息,然后将其存储在我的应用程序中。我发布了我在@finally块中创建的解析器,但Instruments仍将其显示为内存泄漏。除此之外,应用程序的行为非常完美。这里的代码:内存泄漏与NSXMLParser

NSXMLParser *myParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; //<--memory leak 

@try { 

    if (myParser != nil) 
    { 
     [myParser setDelegate:self]; 
     [myParser setShouldProcessNamespaces:NO]; 
     [myParser setShouldReportNamespacePrefixes:NO]; 
     [myParser setShouldResolveExternalEntities:NO]; 
    } 

    [myParser parse]; 

} 
@catch (NSException * e) { 
    NSLog(@"%@, %@",[e name], [e reason]); 
} 
@finally { 
    [xmlURL release]; 
    [myParser release]; 
} 

任何建议为什么这显示为内存泄漏?

**编辑* * *

下面是委托方法我已经在我的代码实现:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI 
(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
if ([elementName isEqualToString:@"Cube"]) 
{ 
    if ([attributeDict objectForKey:@"time"]) 
    { 
     NSArray *pathsArray = 
     NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *path = [pathsArray objectAtIndex:0]; 
     NSString *timePlistPath = [NSString stringWithString: 
      [path stringByAppendingString:@"/time.plist"]]; 

     NSString *TimeString = [attributeDict objectForKey:@"time"]; 
     [TimeString writeToFile:timePlistPath atomically:YES 
      encoding:NSUnicodeStringEncoding error:nil]; 
    } 

    if ([attributeDict objectForKey:@"currency"] && [attributeDict objectForKey:@"rate"]) 
    { 
     NSString *currencyObject = [attributeDict objectForKey:@"currency"]; 
     NSString *rateObject = [attributeDict objectForKey:@"rate"]; 
     [mAryCurrency addObject:currencyObject]; 
     [mAryRates addObject:rateObject]; 
    } 
} 

}

难道这是原因的泄漏?

+0

一切都在你的贴码是否正确。这可能是NSXMLParserDelegate回调中的一些东西。尝试在这些方法中评论代码并查看泄漏是否仍然存在。 – Max 2011-02-28 01:23:42

这是因为它在@finally可能是在检查它最有可能假设时@finally不会被调用,如果它显示为Build &分析中的泄漏,我会忽略它。

即使苹果建议用户在@finally释放:

- (void)doSomething { 

    NSMutableArray *anArray = nil; 

    array = [[NSMutableArray alloc] initWithCapacity:0]; 

    @try { 

     [self doSomethingElse:anArray]; 

    } 

    @finally { 

     [anArray release]; 

    } 
} 
+0

@ finalally { [xmlURL release]; [myParser发布]; } - 你见过吗? – Max 2011-02-28 01:21:21