我使用
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,并根据该更改您的代码.