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

我使用
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,它会导致应用程序崩溃导致内存不足警告问题.

如何在不造成内存问题的情况下以原始分辨率获取图像.

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

最佳答案 您声明的’returnArray’变量位于自动释放池块之外.

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

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

width x height x n bytes其中n是用于表示每个像素的颜色的位数,大部分是4.

所以对于相同的2048 x 1536图像,它将需要12MB.

因此,现在检查您正在谈论的图像的原始分辨率是多少,并计算它将采用多少MB,并根据该更改您的代码.

点赞