Iphone 需要RSS阅读器内存泄漏方面的帮助吗

Iphone 需要RSS阅读器内存泄漏方面的帮助吗,iphone,nsxmlparser,memory-leaks,Iphone,Nsxmlparser,Memory Leaks,我正在尝试为iPhone编写一个简单的RSS阅读器,它似乎工作得很好,直到我开始使用仪器,发现我的应用程序正在泄漏大量内存 我正在使用NSXMLParser类解析RSS提要。我的内存泄漏似乎源自被重写的委托方法: -(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串 及 -(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSStrin

我正在尝试为iPhone编写一个简单的RSS阅读器,它似乎工作得很好,直到我开始使用仪器,发现我的应用程序正在泄漏大量内存

我正在使用NSXMLParser类解析RSS提要。我的内存泄漏似乎源自被重写的委托方法:

-(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串

-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName

我还怀疑从我解析的数据中填充单元格的代码,我已经包含了这些方法和其他一些关键方法的代码,任何见解都将不胜感激


我发现了我的问题,我所有的内存泄漏都源于这句话:

self.stories = [[NSMutableArray alloc] init];
这将导致故事的保留计数增加2,因为setter在新分配的数组上调用retain

我用这句话替换了上面的话,它解决了我的问题:

NSMutableArray *array = [[NSMutableArray alloc] init];
self.stories = array;
[array release];

另一种修复代码的方法是替换

self.stories = [NSMutableArray alloc] init];

该方法是自动释放的,因此不需要手动调用release。(这适用于其他类别,即setWithCapacity、stringWithFormat等)

谢谢,山姆


PS对你的问题没有帮助,但这些行看起来有点不寻常:

[self.currentTitle release];
您可能应该这样做:

self.currentTitle = nil;

这将释放与代码相同的currentTitle,但也会将其设置为nil,这意味着您不能再次错误地使用它

我浏览了你的代码,没有任何明显的错误;您可能想尝试Xcode的“构建和分析”命令,该命令应该会向您指出它发现的任何潜在漏洞。感谢您的评论,我实际上使用的是Xcode 3.1,因此该功能对我不可用,但我确实下载了Clang并从终端在我的项目上运行了它,它没有出现任何错误。

// Override to support row selection in the table view.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // Navigation logic may go here -- for example, create and push another view controller.
    // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
    int index = [indexPath indexAtPosition: [indexPath length] - 1];
    if (currentLevel == 1) {
        StoryViewController *storyViewController = [[StoryViewController alloc] initWithURL:[[stories objectAtIndex: index] objectForKey:@"URL"] nibName:@"StoryViewController" bundle:nil];
        [self.navigationController pushViewController:storyViewController animated:YES];
        [storyViewController release];
    } else {
        RootViewController *rvController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
        rvController.currentLevel = currentLevel + 1;
        rvController.rssIndex = index;
        [self.navigationController pushViewController:rvController animated:YES];
        [rvController release];
    }
}
self.stories = [[NSMutableArray alloc] init];
NSMutableArray *array = [[NSMutableArray alloc] init];
self.stories = array;
[array release];
self.stories = [NSMutableArray alloc] init];
self.stories = [NSMutableArray arrayWithCapacity:10];
[self.currentTitle release];
self.currentTitle = nil;