Проблема с памятью при использовании UIImagePNGRepresentation - PullRequest
3 голосов
/ 30 января 2012

Привет, ребята. Этот модуль оказался проблематичным.Я импортирую более 100 изображений из Photolibrary, сохраняю их в каталоге документов с другим именем.Как и ожидалось, у меня была проблема с памятью в необычном месте.Кажется, UIImagePNGRepresenation кеширует файлы.Поэтому, когда я запускаю описанный ниже процесс для 300+ изображений, я вижу «Всего байт» в диапазоне 3,00 ГБ и вылетает из-за памяти (протестировано в инструменте выделения ресурсов).Я вставил код ниже.Есть ли альтернатива этому коду

-(void)something
{
   NSData *data=nil;
   for (int i=0; i<numberOfImages; i++) {

    @autoreleasepool {

        UIImage *image=[UIImage imageNamed:[NSString stringWithFormat:@"image%d.png",i]];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *documentsDirectory = [[paths objectAtIndex:0] stringByAppendingString:@"directoryname"];

        NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"image%d.png",i]];

        //convert image into .png format
        data=UIImagePNGRepresentation(image);
        [data writeToURL:[NSURL URLWithString:fullPath] atomically:NO];
      }
   }
   data=nil;
}

Ответы [ 3 ]

2 голосов
/ 22 декабря 2016

Я решил эту проблему, отправив 4-канальное изображение (RGBA или RGBX) вместо 3-канального изображения (RGB).

Вы можете проверить, есть ли возможность изменить параметры вашего изображения.

1 голос
/ 02 февраля 2012

Я отправил эту проблему по почте в Apple, и они попросили меня ввести циклы сна между каждым распределением.Добавьте сон перед распределением.

1 голос
/ 30 января 2012

Кэширование исходит от [UIImage imageNamed:], а не UIImagePNGRepresentation().Сделайте это вместо:

NSString *imageName = [NSString stringWithFormat:@"image%d.png", i];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

...
...