Проблема памяти Objective C UIImagePNGRepresentation (с использованием ARC)

У меня есть приложение на основе ARC, которое загружает около 2000 довольно больших (1-4 МБ) изображений в кодировке Base64 из веб-сервиса. Он преобразует декодированные строки Base64 в файлы изображений .pngи сохраняет их на диск. Все это делается в цикле, где у меня не должно быть затяжных ссылок.

Я профилировал свое приложение и обнаружил, что UIImagePNGRepresentation занимает около 50% доступной памяти.

Насколько я понимаю, UIImagePNGRepresentation кэширует изображения, которые создает. Один из способов исправить это — очистить этот кеш.Любые идеи, как можно это сделать?

Другим решением может быть использование чего-то другого, кроме UIImagePNGRepresentation?

Я уже пробовал это, но безуспешно: Проблема с памятью при использовании UIImagePNGRepresentation. Не говоря уже о том, что я не могу использовать представленное там решение, потому что это сделает мое приложение слишком медленным.

Это метод, который я вызываю из своего цикла. UIImage - это изображение, преобразованное из Base64:

+ (void)saveImage:(UIImage*)image:(NSString*)imageName:(NSString*)directory {
  NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.
  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it
  NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory
  NSString *pathToFolder = [documentsDirectory stringByAppendingPathComponent:directory];

  if (![fileManager fileExistsAtPath:pathToFolder]) {
    if(![fileManager createDirectoryAtPath:pathToFolder withIntermediateDirectories:YES attributes:nil error:NULL]) {
       // Error handling removed for brevity
    }
  }

  NSString *fullPath = [pathToFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; //add our image to the path
  [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)

  // clear memory (this did nothing to improve memory management)
  imageData = nil;
  fileManager = nil; 
}

EDIT: Размеры изображения варьируются примерно от 1000*800 до 3000*2000.

7
задан Community 23 May 2017 в 12:08
поделиться