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