我对内存管理的理解似乎存在根本的差距。下面的代码位于一个单例中,在我的应用程序中多次调用该单例以解析从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];

最佳答案

我喜欢让物业为我处理。如果articleString属性设置为retain,那么这很简单。

self.articleString = [[[NSMutableString alloc] initWithData:articleData encoding:NSUTF8StringEncoding] autorelease];

[self doStuff];


然后

- (void)dealloc {
    self.articleString = nil;
    [super dealloc]
}


设置新的字符串时,该字符串将被释放并正确保留。它将在dealloc上清除。

关于iphone - 具有单例属性的iPhone内存管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2259470/

10-11 16:37