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