我需要从文档文件夹中读取图像并准备UIImage。但是当我每次内存增加时调用此函数时,对于大规模图像,此比例很大。以下是相同的代码
-(UIImage*) GetSavedImageWithName:(NSString*) aFileName
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSMutableString* str = [[NSMutableString alloc] initWithCapacity:300];
[str appendString:documentsDirectory];
[str appendString:@"/"];
[str appendString:aFileName];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL success = [fileManager fileExistsAtPath:str];
NSData *dataToWrite = nil;
UIImage* image = nil;
if(!success)
{
}
else
{
dataToWrite = [[NSData alloc] initWithContentsOfFile:str];
image = [UIImage imageWithData:dataToWrite]; YES;
}
if(dataToWrite)
{
[dataToWrite release];
dataToWrite = nil;
}
if(str)
{
[str release];
str = nil;
}
if(fileManager)
{
[fileManager release];
fileManager = nil;
}
return image;
}
以这种方式打电话
[self SetFrontViewImage:[self GetSavedImageWithName:@"Edited"]];
我无法找到泄漏的地方。
谢谢,
Sagar的
答案 0 :(得分:4)
它消耗更多内存,因为您正在阅读文件转换文件,将其转换为图像并再次使用类方法。
所以改为使用以下方式:
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL success = [fileManager fileExistsAtPath:str];
UIImage* image = nil;
if(!success)
{
return nil;
}
else
{
image = [[UIImage alloc] initWithContentsOfFile:str]; YES;
}
return [image autorelease];
}
不要发布文件管理器对象。它是一个自动释放对象。
答案 1 :(得分:0)
因为返回的UIImage是一个自动释放对象。这意味着运行循环将在以后释放这些自动释放对象。在释放这些自动释放对象之前,内存空间会增长,尤其是在使用循环或工作线程加载图像时。