Самый эффективный способ памяти сохранить фотографию на диск на iPhone?

Из профилирования сInstruments Я узнал, что способ сохранения изображений на диск приводит к скачкам памяти в~60MB, Это приводит к излучению приложенияlow memory warnings, что (непоследовательно) приводит к сбоям наiPhone4S Бег .iOS7

Мне нужен самый эффективный способ сохранить изображение на диск.

Я сейчас использую этот код

+ (void)saveImage:(UIImage *)image withName:(NSString *)name {
    NSData *data = UIImageJPEGRepresentation(image, 1.0);
    DLog(@"*** SIZE *** : Saving file of size %lu", (unsigned long)[data length]);
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];
    [fileManager createFileAtPath:fullPath contents:data attributes:nil];
}

Заметки:

Уменьшение стоимостиcompressionQuality аргумент вUIImageJPEGRepresentation не значительно уменьшает всплеск памяти. напримерcompressionQuality = 0.8, уменьшил всплеск памяти на3MB в среднем за100 пишет. Тем не менее, это уменьшает размер данных на диске (очевидно), но это не помогает мне.

UIImagePNGRepresentation на местеUIImageJPEGRepresentation хуже для этого. Это медленнее и приводит к более высоким пикам.

Возможно ли, чтоэтот подход сImageIO будет более эффективным? Если так, то почему?

Если у кого-то есть предложения, было бы здорово. Спасибо

Редактировать:

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

а) Хотя я сохранял несколько изображений, я не сохранял их в цикле. Я немного перечитал и протестировал и обнаружил, что пул авто-релиза немне не поможет

б) фотографии не были размером 60 МБ каждая. Это были фотографии, сделанные на iPhone 4S.

Имея это в виду, я вернулся к попыткам преодолеть то, что, по моему мнению, было проблемой; линия .NSData *data = UIImageJPEGRepresentation(image, 1.0);

Пики памяти, которые вызывали сбой, можно увидеть на скриншоте ниже. Они соответствовали когдаUIImageJPEGRepresentation назывался. Я тоже побежалTime Profiler а такжеSystem Usage который указал мне в том же направлении.

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

photoData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];

Который возвращает объект типаNSDataЗатем я использовал это как данные для записи с использованием NSFileManager.

Это полностью удаляет всплески в памяти.

т.е.

[self saveImageWithData:photoData];

где

+ (void)saveImageWithData:(NSData *)imageData withName:(NSString *)name {
    NSData *data = imageData;
    DLog(@"*** SIZE *** : Saving file of size %lu", (unsigned long)[data length]);
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];
    [fileManager createFileAtPath:fullPath contents:data attributes:nil];
}

PS: я не ставлю это как ответ на вопрос, если люди считают, что он не отвечает на заголовок "Самый эффективный способ памяти сохранить фотографию на диск на iPhone? ", Однако, если консенсус таков, что это должно быть, я могу обновить его.

Благодарю.

Ответы на вопрос(3)

Ваш ответ на вопрос