Iphone 需要RSS阅读器内存泄漏方面的帮助吗
我正在尝试为iPhone编写一个简单的RSS阅读器,它似乎工作得很好,直到我开始使用仪器,发现我的应用程序正在泄漏大量内存 我正在使用NSXMLParser类解析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
-(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;