2013-08-01 13 views
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, из-за которой приложение терпит крах.

Как я могу получить изображение с оригинальным разрешением, не вызывая проблем с памятью.

P.S: Я не использую ARC в своем проекте.

+0

Что делать, если вы переместите код установки изображения из блока асинхронизации. Когда вам нужно показать изображения, используйте AssetURL, чтобы перейти к изображению. Другими словами, динамически загружайте изображения, поскольку они собираются войти в видимый кадр, вместо того, чтобы выделять их, когда они не нужны, поскольку они являются большими файлами. – jarryd

+0

Я не могу получить исходное изображение с разрешением от AssetURL, каков способ сделать это? –

+0

Не совсем уверен, почему вы храните копию изображения в словаре, когда у вас уже есть ссылка на ALAsset и, следовательно, на изображение. Итак, эта строка [temp setObject: [UIImage imageWithCGImage: [[свойство defaultRepresentation] fullScreenImage] scale: 1 ориентация: (UIImageOrientation) [[свойство defaultRepresentation]]] forKey: UIImagePickerControllerOriginalImage]; должно быть просто [UIImage imageWithCGImage: [[свойство defaultRepresentation] fullScreenImage] scale: 1 ориентация: (UIImageOrientation) [[свойство defaultRepresentation]]]; при назначении видимому изображению. – jarryd

ответ

2

Переменная «returnArray», которую вы указали, находится за пределами блока пула автозапуска. Теперь вы добавляете свое изображение в словарь «temp», который находится внутри пула автовыпусков, но в конечном итоге вы добавляете эту «temp» в «returnArray» и, следовательно, увеличиваете счетчик, который вызывает утечку на самом деле.

Даже имейте в виду еще одну вещь при работе с изображениями. Когда вы используете изображение, он не принимает в памяти то, что он показывает как размер файла, как многие ожидали бы (т. Е. Что-то меньше 3 МБ для 2048 x 1536). Вместо этого он фактически загружен в сыром памяти формата принимать на основе расчета следующим образом:

ширина х высота х байт, где п число битов, принимаемых для представления цветов на пиксель в основном это 4.

так что для то же изображение 2048 x 1536 займет 12 МБ.

Итак, теперь проверьте, каково первоначальное разрешение изображения, о котором вы говорите, и подсчитаете, сколько MB его потребуется, и измените свой код в соответствии с этим.

0

Вы декомпрессируете все изображения одновременно. Подождите, пока вы в них не будете абсолютно нужны.