2012-02-15 2 views
1

У меня есть странная проблема при сохранении числа больших изображений (от камеры) в файловой системе один за другим в цикле.Сохранение больших изображений один за другим освобождение памяти на iOS

Если я размещаю [NSThread sleepForTimeInterval:1.0]; в каждом цикле, память освобождается только после каждой обработки изображений. Но без этого интервала ожидания распределение памяти увеличивается выше крыши и, в конечном итоге, происходит сбой приложений ...

Может кто-нибудь объяснить, как избежать этого или освободить память после каждого цикла?

Btw, я разрабатываю на прошивке 5 ...

Это мой код:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    for (NSDictionary *imageInfo in self.imageDataArray) { 

     [assetslibrary assetForURL:[NSURL URLWithString:imageUrl] resultBlock:^(ALAsset *asset) { 
      CGImageRef imageRef = [[asset defaultRepresentation] fullResolutionImage]; 
      if (imageRef) { 
       [sharedAppSettingsController saveCGImageRef:imageRef toFilePath:filePath]; 
       imageRef = nil; 
       [NSThread sleepForTimeInterval:1.0]; 
       //CFRelease(imageRef); 
      } 
     } failureBlock:^(NSError *error) { 
      NSLog(@"booya, cant get image - %@",[error localizedDescription]); 
     }]; 

    } 

    // tell the main thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //do smth on finish 
    }); 
}); 

И это метод для сохранения CGImage ФС:

- (void)saveCGImageRef:(CGImageRef)imageRef toFilePath:(NSString *)filePath { 
    @autoreleasepool { 
     CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:filePath]; 
     CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypeJPEG, 1, NULL); 
     CGImageDestinationAddImage(destination, imageRef, nil); 

     bool success = CGImageDestinationFinalize(destination); 
     if (!success) { 
      NSLog(@"Failed to write image to %@", filePath); 
     } 
     else { 
      NSLog(@"Written to file: %@",filePath); 
     } 
     CFRelease(destination); 
    } 
} 
+0

Вы обернули свою петлю в блок @autorelease {}? – Nyx0uf

+0

Можете ли вы разместить код –

+0

Я обернул код внутри и снаружи цикла без эффекта. Приложение по-прежнему потребляет более 20 МБ оперативной памяти и, чем сбои. Что еще нужно искать? –

ответ

2

Проблема в том, что вы вызываете «assetForURL» в цикле for. Этот метод начнет загружать все ваши изображения одновременно в отдельный поток. Вы должны начать загрузку 1 изображения, а в блоке завершения продолжить загрузку следующего. Я предлагаю вам использовать какую-то рекурсию.

+0

Спасибо, что сработало ... –

0

Я только выяснил, что проблема заключается не в методе saveImageRef, а в объекте ALAssetRepresentation:

CGImageRef imageRef = [[asset defaultRepresentation] fullResolutionImage]; 

imageRef выделяет огромное количество памяти после прочтения каждого исходного изображения из библиотеки фотографий. Это логично.

Но я хочу, чтобы этот объект imageRef был выпущен в конце каждого цикла, а не когда ARC решает его освободить.

Итак, я пробовал imageRef = nil; после каждого цикла, но ничего не изменилось.

Есть ли другой способ освобождения выделенной памяти в конце каждого цикла?

Смежные вопросы