IOS / iPhone загрузка изображений в UIImage на основе проблемы с памятью значения слайдера - PullRequest
1 голос
/ 03 апреля 2011

Я загружаю изображения в UIImage со значениями ползунка (если хотите, это страницы или слайды).Этот UIImage переключает их очень быстро с помощью ползунка.Проблема в том, что в определенный момент приложение вылетает на устройстве с ошибкой:

2011-04-02 17: 39: 01.836 Book1 [2123: 307] Получено предупреждение о памяти.Уровень = 1

Вот код:

- (IBAction)slidePages:(id)sender{
    int sliderValue = pageSlider.value;

    NSString *slideToPage = [NSString stringWithFormat:@"P%i.jpg", sliderValue];
    imagePlaceholder.image = [UIImage imageNamed:slideToPage];

    pageDisplay.text = [NSString stringWithFormat:@"Page %i", sliderValue];

    currentPage = sliderValue;  
}

Могу ли я что-нибудь сделать, чтобы сделать его более эффективным?Возможно, ошибка в другом месте, но я предполагаю, что это связано с быстрой загрузкой изображений.

Тем не менее, я не знаю, как iOS справляется с этим.Каждый раз, когда я загружаю новое изображение в UIImage, что происходит с «незагруженным»?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 03 апреля 2011

Одним из важных аспектов [UIImage imageNamed] является то, что он кэширует все изображения, загруженные таким образом, и они никогда не выгружаются, даже если вы освобождаете созданный UIImage!Это хорошо в некоторых обстоятельствах (например, небольшие изображения в ячейках UITableView), но плохо в других (например, большие изображения).

Решение состоит в том, чтобы использовать [UIImage imageWithData], который не выполняет это кэширование и который выгружает данныекогда UIImage имеет значение dealloc'd.

Дополнительная информация и обсуждение здесь:

Разница между [UIImage imageNamed ...] и [UIImage imageWithData ...]?

Обновление

Этот вопрос содержит полезную информацию о том, что [UIImage imageNamed:] не очищает свой кэш при появлении предупреждения о памяти.

2 голосов
/ 03 апреля 2011

[UIImage imageNamed:] кэширует изображения, поэтому каждое загруженное изображение эффективно пропускает. Я не знаю, что такое каноническое решение, но одним из вариантов может быть загрузка изображения с CGImageCreateWithJPEGDataProvider() и инициализация его с [UIImage imageWithCGImage:].


Оригинальный (неправильный) ответ:

Возможно, вам придется выпустить предыдущее изображение перед загрузкой текущего.

0 голосов
/ 03 апреля 2011

Загрузка большого количества изображений в iOS всегда была проблемой с памятью.Как упоминал Марсело, вы должны держать только те изображения, которые вы сейчас просматриваете.Все остальные образы должны быть освобождены, чтобы их можно было собирать мусором и освобождать память.По моему опыту, даже загрузка 2 довольно больших изображений (500k-2mb каждый) вызовет проблемы с памятью, особенно на старых устройствах с меньшим объемом оперативной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...