我正在使用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
。
答案 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)
您正在解压缩所有图像。等到你绝对需要它们。