2011-03-20 67 views
0


我的应用程序出现奇怪的问题。
当我打开我的应用程序在解析一个RSS提要并显示在tableview中的结果,并没有泄漏,但如果我按下刷新按钮,它泄漏(很多):(NSXMLParser刷新漏洞

我的项目:Link

代码:
viewDidLoad中

UIBarButtonItem *ShareButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(tableView_ReFresh)]; 
self.navigationItem.rightBarButtonItem = ShareButton; 
[ShareButton release]; 

viewDidAppear

if ([stories count] == 0) { 
    NSURL *path = [[NSURL alloc] initWithString:@"http://feeds.feedburner.com/TheAppleBlog"]; 
    [self parseXMLFileAtURL:path]; 
    [path release]; 
} 

tableView_ReFresh

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSURL *path = [[NSURL alloc] initWithString:@"http://feeds.feedburner.com/TheAppleBlog"]; 
[self parseXMLFileAtURL:path]; 
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 
[path release]; 
[pool drain]; 

reloadData

[blogTable reloadData]; 

parseXMLFileAtURL

stories = [[NSMutableArray alloc]init]; 
[[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
[[NSURLCache sharedURLCache] setDiskCapacity:0]; 
NSData *xml = [NSData dataWithContentsOfURL:URL]; 
rssParser = [[NSXMLParser alloc] initWithData:xml]; 
[rssParser setDelegate:self]; 
// Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser. 
[rssParser setShouldProcessNamespaces:NO]; 
[rssParser setShouldReportNamespacePrefixes:NO]; 
[rssParser setShouldResolveExternalEntities:NO]; 
[rssParser setDelegate:self]; 
[self.view setNeedsDisplay]; 
[rssParser parse]; 
[xml release]; 

didStartElement

currentElement = [[elementName copy]autorelease]; 
if ([elementName isEqualToString:@"item"]) { 
    // clear out our story item caches... 
    item = [[[NSMutableDictionary alloc] init]autorelease]; 
    currentTitle = [[NSMutableString alloc] init]; 
    currentDate = [[NSMutableString alloc] init]; 
    currentContent = [[NSMutableString alloc] init]; 
    currentPostID = [[NSMutableString alloc] init]; 
    currentCommentLink = [[NSMutableString alloc] init]; 
    currentCommentNum = [[NSMutableString alloc] init]; 
} 

didEndElement

if ([elementName isEqualToString:@"item"]) { 
    // save values to an item, then store that item into the array... 
    [item setObject:currentTitle forKey:@"title"]; 
    [item setObject:currentPostID forKey:@"link"]; 
    [item setObject:currentContent forKey:@"Content"]; 
    [item setObject:currentDate forKey:@"date"]; 
    [item setObject:currentCommentLink forKey:@"commentRssLink"]; 
    [item setObject:currentCommentNum forKey:@"commentsNum"]; 

    [stories addObject:[item copy]]; 
    NSLog(@"adding story: %@", currentPostID); 
    //NSLog(@"adding story: %@", currentContent); 
} 

foundCharacters

if ([currentElement isEqualToString:@"title"]) { 
    [currentTitle appendString:string]; 
} else if ([currentElement isEqualToString:@"guid"]) { 
    [currentPostID appendString:string]; 
} else if ([currentElement isEqualToString:@"content:encoded"]) {  
    [currentContent appendString:string]; 
} else if ([currentElement isEqualToString:@"pubDate"]) { 
    [currentDate appendString:string]; 
} else if ([currentElement isEqualToString:@"wfw:commentRss"]) { 
    [currentCommentLink appendString:string]; 
} else if ([currentElement isEqualToString:@"slash:comments"]) { 
    [currentCommentNum appendString:string]; 
} 

parserDidEndDocument

[blogTable reloadData]; 

的dealloc

[super dealloc]; 
[currentElement release]; 
[rssParser release]; 
[stories release]; 
[item release]; 
[currentTitle release]; 
[currentDate release]; 
[currentContent release]; 
[currentPostID release]; 
[currentCommentLink release]; 
[currentCommentNum release]; 

我该如何解决这个问题? 谢谢

回答

0

我认为你需要阅读关于内存管理的文档。每解析一次,首先分配NSXMLParser,然后为XML文件中的每个“item”元素分配字符串而不释放它们。

最简单的路线,如果不完全了解问题,就是为您的ivars创建属性,并在您想为它们分配新值时调用'self.ivar ='。生成的setter将负责释放变量先前指向的内存。

我强烈建议你阅读这虽然: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

0

我的猜测,这是您的泄漏:

stories = [[NSMutableArray alloc]init]; 

你在你的dealloc,我假设释放stories是一个属性,该属性我假设你已经用retain宣布。如果我是正确的,你应该能够通过(A)self.stores = [[NSMutableArray alloc]init];或(B)通过在该行之前放置[stories release];来解决此问题。

假设你的Xcode版本是合理的最新版本,如果你使用Build &运行你的代码分析我猜想它会解决这个问题。

+0

它不工作:(你能看看我的项目吗?谢谢 – user535351 2011-03-21 02:16:52

+0

@ user535351对不起,我没有时间看你的项目。同时,你看了我给你的建议(运行Build&Analyze看看它说了什么)?你有没有读过关于内存管理的Apple文档? – 2011-03-21 03:11:34