У меня есть приложение на основе 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.