Сохранение больших изображений одно за другим освобождение памяти на iOS - PullRequest
1 голос
/ 15 февраля 2012

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

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

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

Кстати, яРазрабатываю на iOS 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 в FS:

- (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);
    }
}

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

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

0 голосов
/ 20 февраля 2012

Я только что обнаружил, что проблема не в методе saveImageRef, а в объекте ALAssetRepresentation:

CGImageRef imageRef = [[asset defaultRepresentation] fullResolutionImage];

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

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

Поэтому я попытался imageRef = nil; после каждого цикла, ноничего не меняется.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...