从Document文件夹中读取UIImage

时间:2010-10-13 06:56:23

标签: iphone

我需要从文档文件夹中读取图像并准备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的

2 个答案:

答案 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是一个自动释放对象。这意味着运行循环将在以后释放这些自动释放对象。在释放这些自动释放对象之前,内存空间会增长,尤其是在使用循环或工作线程加载图像时。