4

我正在使用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应用程序崩溃的问题。

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

PS:我没有ARC在我的项目中使用。

4

2 回答 2

2

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

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

宽度 x 高度 xn 字节,其中 n 是用于表示每个像素颜色的位数,通常为 4。

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

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

于 2013-08-08T15:01:10.973 回答
0

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

于 2013-08-15T06:16:21.797 回答