2013-05-06 3 views
16

Я создаю приложение, которое является своего рода галереей - оно показывает различный медиа-контент в полноэкранном режиме. Инструмент Allocations показывает, что при использовании приложения параметр Live Bytes не превышает 40 МБ. Тем временем приложение на 100% погибает после того, как я сползаю страницы 20-30 раз. Я проверил параметр Dirty Memory и обнаружил, что он был в 10 раз больше размера Live Bytes. И большая часть этого грязной памяти потребляется Image IO:ImageIO грязная память автоматически не очищается iOS

Screenshot http://i40.tinypic.com/25ge51i.jpg

EDIT, еще один скриншот:

Screenshot http://i40.tinypic.com/9t1mh5.png

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

Теперь о дизайне приложения. Экран приложения имеет один горизонтальный вид прокрутки. Просмотр прокрутки содержит видеоролики или объекты коллажа, которые содержат несколько изображений. Чтобы сохранить память, создаются только три страницы за раз - текущая страница и страницы слева/справа. Таким образом, страницы всегда создаются и удаляются на лету при перемещении прокрутки.

Все изображения, которые я загружаю, используют метод [UIImage imageWithContentOfFile: path]. Объект Collage хранит экземпляры UIImage внутри imagesArray. В методе dealloc атрибут imageArray очищается.

Итак, вопросы:

  • Является ли это своего рода система ошибка в [UIImage imageWithContentOfFile?]
  • Является ли это изображение IO кэш?
  • Могу ли я это очистить?
+0

Это не ошибка в прошивке - если бы это было тысяча приложений не будет работать. Как-то ваши изображения не освобождаются. –

+0

Очевидно, проблема в моей программе, но, как вы можете видеть на снимке экрана, память пользователя очищается правильно (первый график показывает ограниченное потребление). С другой стороны, мы видим огромный рост грязной памяти. И я действительно не понимаю, в чем проблема. Кстати, я зарегистрировал метод dealloc, и я увидел, что он был вызван. – ZAN

+1

Итак, что показывает треугольник раскрытия для Image_IO? То есть, опубликуйте список и обновите свой вопрос. –

ответ

19

Сведя здесь слишком большой для комментариев, лишь некоторые идеи:

1) один способ сохранить объекты по ошибке иметь объекты в представлениях, которые получают скрытые, но не удалены из их надтаблиц (и таким образом, пребывание сохраняется)

2), если вы делаете что-нибудь с UIImageView и т.д. на любом потоке не главная нить плохое может случиться (как это)

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

  • вместо нескольких изображений, всегда загружайте одно и то же изображение, но оставляйте остальные части своего кода такими, какие они есть, - что-то изменилось?

  • В любых подклассах, которые вы создаете, чтобы удерживать/удерживать изображения, поместите сообщение журнала в dealloc, чтобы узнать, действительно ли эти объекты освобождаются.

  • подкласс UIImageView, использовать его для изображений и протоколирования, dealloc

  • подкласса UIImage, использовать его для этих изображений, войдите в dealloc

4) Я с трудом у веры imageio есть дефект, который сделает это, но что вы можете сделать, это переключиться на использование imageWithData и загрузить данные самостоятельно. Используйте флаг F_NOCACHE, когда вы действительно читаете данные - на SO есть другой код о том, как это сделать, вы можете искать его (я ответил на вопрос на нем).

Если вы можете создать демонстрационный проект с этим дефектом, было бы намного легче отладить его, чем просто угадать, что делать. Вход в класс, который получает dealloc'd, проходит долгий путь, так как вы сразу увидите, что не освобождается, а затем лучше сосредоточиться на проблеме.

+1

Проблема решена. Произошли инстанции UIImage. Я использовал их для создания с помощью [UIImage imageWithContentOfFile: путь], а пул автозапуска не выпускал их вовремя. После переключения на явное сохранение/освобождение проблемы исчезли. Самая сложная часть для меня - инструмент распределения, не показывающий дополнительного потребления памяти. Насколько я вижу, UIImage не содержит растровых данных, а только ссылку на ImageIO, которая находилась в грязном пространстве памяти. Огромное спасибо Дэвиду, он заверил меня, что это всего лишь проблема с сохранением, так что, наконец, я обнаружил пропущенные случаи. – ZAN

+0

В настоящее время я сталкиваюсь с той же проблемой. Однако мое приложение не является галереей изображений, а простым UIWebView. Это создает увеличение ** Грязная память **, причем большая часть из них связана с данными Image IO и Performance. Вы знаете, с чего мне начать копать? –

+0

@NikhilJJoshi так выпускает веб-просмотр и время от времени заменяет его новым. Это все, о чем я могу думать. Возможно, слишком долго держится на прошлых страницах. Возможно, вы можете установить политику кэширования или удалить старые страницы - не имеют большого опыта работы с этим классом. –

0

В дополнении к ответу Дэвида H, я рекомендовал бы любой, кто испытывает эту проблему также проверить, если ваш взгляд контроллера, модель, UIDocument «s (если вы его используете) deinitializers называется, когда не требуется.

Если вы не правильно освобождаете эти классы, и они содержат данные изображения/VDO/контента, которые UIKit ссылается на него, это может привести к тому, что использование памяти VM: ImageIO всегда увеличивается, и все же вы видите нет утечки памяти при использовании инструментов, так как это содержимое теперь сохраняется внутри UIKit.

Я тоже пережил эту проблему дважды, и в моем случае оказалось, что деинициализатор моей модели никогда не вызывался из-за не связанных между собой проблем. Исправляя эти несвязанные проблемы и следя за тем, чтобы моя Модель была освобождена, эти VM: ImageIO непрерывный рост исчез.

enter image description here

Смежные вопросы