UIGraphicsGetImageFromCurrentImageContext утечка памяти для масштабирования изображения - PullRequest
3 голосов
/ 19 июня 2010

Приложение для iPhone загружает файлы изображений с сервера, сохраняет их в NSTeilitaryDirectory () и затем асинхронно загружает изображение в пользовательский интерфейс.Поток кода выглядит следующим образом:

  1. Показать представление с индикатором загрузки и запустить загрузчик изображений в фоновом режиме.
  2. После загрузки изображения оно записывается в файл.
  3. Таймер в представлении загрузки продолжает проверять наличие файла во временном каталоге и, когда он становится доступным, загружает изображение из файла и добавляет изображение в пользовательский интерфейс.
  4. Перед добавлением изображения,он масштабируется до необходимого размера.

Проблема в том, что я использую UIGraphicsGetImageFromCurrentImageContext для масштабирования изображения.Похоже, память, используемая контекстом изображения, не очищается.Память приложения продолжает увеличиваться по мере загрузки новых файлов.

Пример кода ниже:

Код для масштабирования изображения:


-(UIImage*)scaleToSize:(CGSize)size image:(UIImage *)imageref
{
 UIGraphicsBeginImageContext(size);
 [imageref drawInRect:CGRectMake(0, 0, size.width, size.height)];
 UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 return scaledImage;
}

Загрузка изображения из временного каталога:


-(void)loadImageFromFile: (NSString *) path
{
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 UIImage * imm = [[[UIImage alloc] initWithContentsOfFile:path] autorelease];
 [self performSelectorOnMainThread:@selector(insertImage:) withObject:imm waitUntilDone:YES];
 [pool release];
}

Добавление изображения для просмотра (подмножество кода):


 self.imageContainer = [[UIImageView alloc] initWithFrame:CGRectMake(0,80,320,250)];
 [self addSubview:self.imageContainer];
 self.imageContainer.image = [self scaleToSize:CGSizeMake(320.0f, 250.0f) image:imm];
 [imageContainer release];

Чего мне здесь не хватает

1 Ответ

0 голосов
/ 24 декабря 2016

Один из способов избежать утечки из UIGraphicsGetImageFromCurrentImageContext - вообще не вызывать ее, изменяя размер контейнера вместо прямого изменения размера изображения:

self.imageContainer.contentMode = UIViewContentModeScaleAspectFit;
self.imageContainer.frame = CGRectMake(self.imageContainer.frame.origin.x, self.imageContainer.frame.origin.y, 320.0f, 250.0f);
...