UIImageView не освобождает память (согласно VM Tracker) - Предупреждения о нехватке памяти и завершение

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

Вот список моего порядка операций:

  1. При запуске приложения показывать миниатюры изображений, снятых в приложении (очевидно, что при первом запуске приложения этот список пуст).
  2. Нажмите кнопку камеры, чтобы запустить UIImagePickerController
  3. Пользователь делает снимок и сохраняет его (опять же, сохраняется предварительный просмотр и сохраняется полномасштабное фото)
  4. Список эскизов обновится и покажет новое изображение для предварительного просмотра. Опять же, общий размер «Image IO» в инструменте VM Tracker все еще очень мал (увеличен максимум на 0,5 МБ).
  5. User touches one of the preview images, which launches a different view controller that does the following:
    • Create new UIImageView, load the image, add as a subview to View Controllers view
    • Внезапно «Image IO» подскакивает на 30 МБ.

Это не имеет большого значения, но когда я возвращаюсь (всплывающий навигационный контроллер), ни тип «Image IO», ни тип «Dirty» не уменьшаются в размере. Как будто UIImageView не уничтожается. Каждый раз, когда я нажимаю этот контроллер представления и загружаю изображение, размер увеличивается на 30 МБ, а извлечение никогда не уменьшает его.

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

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

Предварительный просмотр: [UIImageJPEGRepresentation([UIImage imageWithImage:image scaledToSize:CGSizeMake(300, 400)], 0.4f) writeToFile:previewPath atomically:NO];

Полный: [UIImageJPEGRepresentation(image , 0.8f) writeToFile:imagePath atomically:NO];

Моей главной заботой является (1) выяснение того, как избавиться от памяти, используемой из UIImage, после того, как я вставлю содержащий контроллер представления, но я также хотел бы знать (2), почему изображение составляет 30 МБ при загрузке.


person thephatp    schedule 16.07.2013    source источник
comment
(1) Я уже видел подобную проблему с просмотром изображения, попробуйте установить его изображение на nil, прежде чем выталкивать контроллер, и посмотрите, сохраняется ли проблема. (2) Зависит от размера изображения, но несжатое изображение может занимать много места (4000x2000) — 32 МБ. Если это проблема, вам следует немного взглянуть на тайлинг (я думаю, это было даже описано на WWDC).   -  person Matic Oblak    schedule 16.07.2013
comment
@MaticOblak, хорошие рекомендации. Для (1) я попытался установить представление, содержащее представление изображения, на ноль, и это не сработало, но у вас есть хорошая мысль. Я мог бы попробовать создать переменную экземпляра как для UIImageView, так и для UIImage и установить для обоих значение nil (сначала, конечно, UIImage), прежде чем выталкивать и посмотреть, работает ли это. За (2) спасибо за информацию - я обязательно посмотрю. :)   -  person thephatp    schedule 16.07.2013
comment
@MaticOblak, №1 сработал! Я явно установил для UIImage И UIImageView значение nil (не уверен, нужны ли оба), и, конечно же, он освободил память. Если вы опубликуете это как ответ, я отмечу это как принятое решение! Спасибо!!   -  person thephatp    schedule 16.07.2013


Ответы (2)


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

не загружайте изображения с [UIImage imageNamed:] для загрузки изображения в ImageView, это вызывает проблемы с памятью, когда изображений больше нет,

использовать этот,

 NSString * imgpath= [ [ NSBundle mainBundle] pathForResource:@"imageName" ofType:@"png"];

 ImageView.image=[UIImage imageWithContentsOfFile: imgpath];
person hmdeep    schedule 17.04.2014

Как предложил @Matic Oblak...

(1) Я уже видел подобную проблему с просмотром изображения, попробуйте установить его изображение на «ноль», прежде чем выталкивать контроллер, и посмотрите, сохраняется ли проблема.

РЕЗУЛЬТАТ: я явно установил для UIImage И UIImageView значение nil (не уверен, нужны ли оба), и, конечно же, он освободил память.

person thephatp    schedule 02.08.2013