Проблема с памятью при запросе данных изображения галереи с помощью Photos Framework в iOS

Я работаю над приложением для iOS, в котором мне нужно получить все изображения из галереи iPhone, а затем получить его значение exif. Чтобы получить значение exif, мне нужно получить изображение, используя данные изображения.

Я использую для этого следующий код:

-(void)getExifDataFromImage:(NSInteger)index{
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous=YES;
options.resizeMode=PHImageRequestOptionsResizeModeFast;

[[PHImageManager defaultManager] requestImageDataForAsset:asset
                                                  options:options
                                            resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info)
 {

     CIImage* ciImage = [CIImage imageWithData:imageData];
     NSLog(@"Metadata : %@", ciImage.properties);

     exifCount++;

     NSDictionary *pro=ciImage.properties;
     NSDictionary *exifDic=[pro objectForKey:@"{Exif}"];
     NSDictionary *tiffDic=[pro objectForKey:@"{TIFF}"];

}];}

Все работает нормально для изображений около 1200, но если мы превысим это значение, мы получим проблемы с памятью и приложение вылетит.

Я также попытался получить изображение, используя приведенный ниже код, чтобы получить изображение, а затем попытался найти значение exif для изображения с измененным размером.

 [self.imageManager requestImageForAsset:asset targetSize:CGSizeMake(360, 360) contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage *result, NSDictionary *info)
     {
         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
             [self doSomething]
             dispatch_async(dispatch_get_main_queue(), ^{
                 imageView.image=result;
             });//
         });
     }];

Но я не могу получить значение exif для изображений с измененным размером.

Ошибка: libBacktraceRecording.dylib: allocate_free_list_pages() -- исчерпана виртуальная память!

Пожалуйста, предложите мне, как справиться с этой проблемой сбоя памяти. Также, пожалуйста, предложите, есть ли другой способ получить значение exif.


person Imran    schedule 02.02.2016    source источник
comment
Где вы вызываете свой метод getExifDataFromImage:?   -  person orkoden    schedule 03.02.2016
comment
@orkoden Я вызываю его в цикле, чтобы получить метаданные всех изображений. На 1000-1500 работает нормально, а потом вылетает из-за проблем с памятью. Можете ли вы сказать мне, как получить метаданные изображения (exif) для всех возможных изображений в Camera Roll, избегая сбоя.   -  person Imran    schedule 20.02.2016
comment
Вы должны делать это партиями, может быть, по 50 изображений одновременно, а не все сразу.   -  person orkoden    schedule 22.02.2016


Ответы (1)


Вы загружаете автоматически выпущенные изображения с помощью CIImage* ciImage = [CIImage imageWithData:imageData];. Это очень быстро израсходует много данных, потому что Autorealeasepool не опустошается.

Вы можете обернуть создание образа и доступ к словарю в @autoreleasepool{/* your code*/}. Или просто используйте CIImage* ciImage = [[CIImage alloc] initWithData:imageData];, чтобы позволить ARC позаботиться об освобождении памяти.

person orkoden    schedule 02.02.2016