导入原始分辨率的多个图像:低内存警告问题

时间:2013-08-01 08:58:32

标签: ios objective-c alassetslibrary cgimage alasset

我正在使用ChuteSDK从照片库导入多个图像,如下所示:

-(void)doneSelected{
NSMutableArray *returnArray = [NSMutableArray array];
[self showHUD];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
    for(id object in [self selectedAssets]){
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        if([object isKindOfClass:[GCAsset class]]){
            ALAsset *asset = [object alAsset];
            NSMutableDictionary* temp = [NSMutableDictionary dictionary];
            [temp setObject:[[asset defaultRepresentation] UTI] forKey:UIImagePickerControllerMediaType];

            [temp setObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage] scale:1 orientation:(UIImageOrientation)[[asset defaultRepresentation] orientation]] forKey:UIImagePickerControllerOriginalImage];

            [temp setObject:[[asset defaultRepresentation] url] forKey:UIImagePickerControllerReferenceURL];
            [returnArray addObject:temp];
        }
        [pool release];
    }
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        if(delegate && [delegate respondsToSelector:@selector(PhotoPickerPlusController:didFinishPickingArrayOfMediaWithInfo:)])
            [delegate PhotoPickerPlusController:[self P3] didFinishPickingArrayOfMediaWithInfo:returnArray];
        [self hideHUD];
    });
});
}

但是fullScreenImage正在为我提供原始图片的缩小版本,如果我使用fullResolutionImage,则会导致low memory warning问题导致应用崩溃。

如何在不引起内存问题的情况下以原始分辨率获取图像。

P.S:我在项目中没有使用ARC

2 个答案:

答案 0 :(得分:2)

您声明的

'returnArray'变量位于自动释放池块之外。 现在,您将图像添加到字典“temp”中,该字典位于自动释放池中,但最终您将此“temp”添加到“returnArray”,因此其保留计数增加,这实际上会导致泄漏。

在使用图像时,甚至要记住一件事。当你使用一个图像时,它不像许多人期望的那样将内存显示为文件大小(即,对于2048 x 1536,某些东西小于3MB)。相反,它实际上是以原始格式加载,根据计算采用内存,如下所示:

width x height x n bytes其中n是表示每个像素颜色的位数,大多数是4。

因此对于相同的2048 x 1536图像,它将占用12MB。

所以现在检查你正在谈论的图像的原始分辨率是多少,并计算它要花多少MB,然后根据它改变你的代码。

答案 1 :(得分:0)

您正在解压缩所有图像。等到你绝对需要它们。