我的记忆管理理解似乎有一个根本性的差距。下面的代码位于我的应用程序中多次调用的单例内,用于解析从Web下载的数据。对于我下载的每篇文章,我分配一个可变字符串,然后进行大量的解析,然后将文件写入文件系统,以便稍后在UIWebView中显示。
但每次我输入此方法时,我都会分配一个新的“articleString”。我永远不会释放这个字符串。我认为这是一个泄漏,但如果我在此方法的底部添加一个版本(在写入文件之后),我的应用程序将在下次调用此方法时崩溃。我不明白为什么它会崩溃,因为下次调用时会分配另一个NSMutableString。
更新:我确实在dealloc方法中发布了articleString。但似乎我应该在这个方法结束时释放,因为我每次进入都会分配。
更新:articleString在标题中定义如下:
@property (nonatomic, retain) NSMutableString *articleString;
下面的parseArticle方法是一系列操纵articleString的方法的占位符。
self.articleString = [[NSMutableString alloc] initWithData:articleData encoding:NSUTF8StringEncoding];
//Parse the article for display
[self parseArticle];
//Write the article string to a file for later display
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"article.html"];
NSLog(@"%@", articleString);
[articleString writeToFile:path atomically:YES];
答案 0 :(得分:1)
我想让属性为我处理这个问题。如果articleString
属性设置为retain
,那么这很简单。
self.articleString = [[[NSMutableString alloc] initWithData:articleData encoding:NSUTF8StringEncoding] autorelease];
[self doStuff];
然后
- (void)dealloc {
self.articleString = nil;
[super dealloc]
}
文章字符串将在您设置新文章时被释放并正确保留。它将在dealloc上清理。