2010-05-25 2 views
3

Я замечаю всплеск памяти, а ответственный вызывающий абонент, как указано в инструментах, - img_data_lock, а ответственная библиотека - CoreGraphics.img_data_lock iphone - imageNamed vs imageWithContentsofFile

Я читал, что этот вопрос относится к кэшируются против не кэшированных нагрузок изображения (Difference between [UIImage imageNamed...] and [UIImage imageWithData...]?) В настоящее время мое приложение загружает серию изображений с помощью imageNamed

замены imageNamed вызова с imageWithContentsOfFile, кажется, решить эту проблему.

У кого-нибудь есть информация о вызывающем устройстве img_data_lock? Зачем кому-то использовать imageNamed, если он берет такие потери в памяти?

+0

Вы тестируете устройство или симулятор? – shosti

+0

Да, я тестирую симулятор, но я также проведу несколько тестов на устройстве. Я получаю приложение к сбою после широкого использования, но, возможно, проблема выше не виновата. Обновит вас больше результатов. – franz

ответ

13

Методы UIImage imageNamed: и imageWithContentsOfFile: делать несколько разные вещи. imageNamed загружает изображение в специальный системный кеш, а затем будущие вызовы с этим путем будут возвращать изображение в кеш, а не перезагружать его с диска. imageWithContentsOfFile просто загружает изображение по указанному вами пути, но не кэширует. Несколько вызовов в imageWithContentsOfFile для одного и того же изображения приведут к нескольким копиям в памяти.

iOS, похоже, не очищает кеш (ну или вообще, я не уверен), когда выдается предупреждение о памяти, что может привести к прекращению использования приложений из-за отсутствия свободной памяти. UIImages, загруженные с помощью imageWithContentsOfFile, реагируют на предупреждения о памяти, очищая их изображения и при необходимости перезагружая их, что может объяснить, почему ваш всплеск памяти исчез.

Кэш-память, как представляется, намного больше в симуляторе, чем в реальном аппаратном обеспечении, проблемы и сбои, которые я видел с помощью UIImages с использованием imageName, произошли только на устройстве. Остерегайтесь при тестировании на симуляторе!

Единственная причина, по которой я могу видеть использование imageName, то же изображение используется много раз в ваших представлениях. В качестве альтернативы вы можете реализовать свой собственный кеш изображения и получить преимущества использования кеша, который вы можете контролировать, как описано здесь: http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/

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