从 Document 文件夹中读取 UIImage

Sag*_*... 2 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;
}
Run Code Online (Sandbox Code Playgroud)

这样调用

 [self SetFrontViewImage:[self GetSavedImageWithName:@"Edited"]];
Run Code Online (Sandbox Code Playgroud)

我无法找到泄漏的地方。

谢谢,

萨加尔

Sag*_*gar 5


它消耗更多的内存,因为您正在读取文件,将其转换为数据,将其转换为图像,然后再次使用类方法。

因此,请改用以下方式:

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];
}
Run Code Online (Sandbox Code Playgroud)

并且不要释放您的文件管理器对象。它是一个自动释放对象。