Уменьшение памяти UIImages от камеры с помощью инструментов - PullRequest
6 голосов
/ 12 января 2012

Мое приложение, использующее ARC, выполняет следующие действия:

  1. Загрузка изображения, сделанного камерой
  2. Сжатие изображения для использования в качестве эскиза.
  3. Я делаю это, используя [UIImage imageWithData: UIImageJPEGRepresentation (original, 0.1f)]
  4. Я установил нулевую ссылку на изображение для ARC, чтобы освободить память

Повторение этой последовательности будет означать, что на экране появятся несколько сжатых миниатюр. Приблизительно после 7 или 8 снимков приложение вылетает из-за нехватки памяти.

В Instruments я пытаюсь использовать Allocations в тандеме с Memory Monitor, чтобы найти источник моей проблемы.

Статистика некоторых инструментов:

Распределение - количество байтов в реальном времени увеличивается примерно на 2 МБ после съемки изображения, но затем уменьшается на 1,5 МБ после того, как исходная ссылка на изображение установлена ​​на ноль. Кажется, это хорошо, но ...

Вот окончательное состояние приложения. # Жизнь кажется очень высокой по сравнению с живыми байтами, верно?

  Live Bytes  #Living   #Transitory  Overall   #Overall Bytes    
   3.72 MB    24538     80679        90.1 MB   105301

Монитор памяти (отслеживающая контрольная головка) - Мое приложение запускается с 7,5 МБ, и при съемке одного снимка это увеличение увеличивается на ~ 13 МБ. Для состояния, которое я перечислил выше, Memory Monitor говорит, что приложение занимает 72,67 МБ «реальной памяти» и 123,79 МБ виртуальной памяти.

Учитывая, что Живые Байты очень малы, я знаю, что делаю что-то правильно. Однако, учитывая, что объем памяти в других местах велик, я также уверен, что делаю что-то очень неправильное. Есть идеи, что это может быть или как отследить?

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Eitan27,

Это не проблема ARC.Это о том, как управлять несколькими большими элементами в памяти.iOS имеет несколько механизмов, чтобы помочь вам здесь.Если вы запишите изображение на флэш-память, а затем снова откроете его как данные, отображенные в памяти, вы в основном решите свою проблему.Как?Операционная система управляет отображением в ваш резидентный объем памяти с неизменяемыми данными.Поскольку эти элементы являются неизменяемыми и, следовательно, никогда не пачкаются, он может при необходимости очистить отображенные страницы.Недостатком этого механизма является ограниченное количество файловых дескрипторов, доступных для каждого приложения.

Andrew

0 голосов
/ 12 января 2012

Использовать блок @autoreleasepool:

@autoreleasepool {
    //code that inits the UIImage and sets it to nil
}

См. ARC предоставляет новый оператор для управления пулами автоматического освобождения раздел Переход к заметкам о выпуске ARC

...