Изменить февраль 2014: обратите внимание, что этот вопрос относится к iOS 2.0! С тех пор требования к изображениям и их обработка сильно изменились. Retina увеличивает размер изображений и немного усложняет их загрузку. Благодаря встроенной поддержке изображений iPad и Retina вам непременно следует использовать ImageNamed в своем коде .
Я вижу, как много людей говорят, что imageNamed
это плохо, но такое же количество людей говорят, что производительность хорошая, особенно при рендеринге UITableView
s. См. Этот вопрос SO, например, или эту статью на iPhoneDeveloperTips.com
UIImage
«S imageNamed
метод , используемый для утечки , так что лучше всего избегать , но была исправлена в последних версиях. Я хотел бы лучше понять алгоритм кэширования, чтобы принять обоснованное решение о том, где я могу доверить системе кэширование моих изображений, а где мне нужно пройти лишнюю милю и сделать это самому. Мое текущее базовое понимание, что это просто NSMutableDictionary
из UIImages
ссылки по имени файла. Он становится больше, а когда заканчивается память, становится намного меньше.
Например, кто-нибудь знает наверняка, что кеш изображений позади imageNamed
не реагирует didReceiveMemoryWarning
? Кажется маловероятным, что Apple этого не сделает.
Если у вас есть представление об алгоритме кеширования, опубликуйте его здесь.
Ответы:
tldr: ImagedNamed в порядке. Он хорошо обрабатывает память. Используйте это и перестаньте беспокоиться.
Изменить ноябрь 2012 : обратите внимание, что этот вопрос относится к iOS 2.0! С тех пор требования к изображениям и их обработка сильно изменились. Retina увеличивает размер изображений и немного усложняет их загрузку. Благодаря встроенной поддержке изображений iPad и Retina вам непременно следует использовать ImageNamed в своем коде. А теперь для потомков:
Сестра нить на форумах Apple , Dev получил несколько лучше трафика. В частности, Ринсвинд добавил немного авторитета.
предупреждая, что
и
Итак, вот оно. imageNamed: не будет разбивать ваши окна или убивать ваших детей. Это довольно просто, но это инструмент оптимизации. К сожалению, он плохо назван, и нет эквивалента, который был бы настолько прост в использовании - поэтому люди злоупотребляют им и расстраиваются, когда он просто выполняет свою работу.
Я добавил категорию в UIImage, чтобы исправить это:
Ринсвинд также включил пример кода для создания вашей собственной оптимизированной версии. Я не вижу, чтобы оно того стоило, но вот оно для полноты картины.
Компромисс с этим кодом заключается в том, что декодированное изображение использует больше памяти, но рендеринг происходит быстрее.
источник
По моему опыту, кеш изображений, созданный imageNamed, не реагирует на предупреждения памяти. У меня было два приложения, которые были настолько скудными, насколько я мог их довести до управления памятью, но все равно по необъяснимым причинам вылетали из-за нехватки памяти. Когда я перестал использовать imageNamed для загрузки изображений, оба приложения стали значительно стабильнее.
Я признаю, что оба приложения загружали довольно большие изображения, но ничего необычного. В первом приложении я просто полностью пропустил кеширование, потому что маловероятно, что пользователь вернется к одному и тому же изображению дважды. Во втором случае я создал действительно простой класс кэширования, который делает именно то, что вы упомянули, - сохраняет UIImages в NSMutableDictionary и затем сбрасывает его содержимое, если я получил предупреждение о памяти. Если бы imageNamed: кешировали таким образом, я бы не увидел никакого повышения производительности. Все это работало на 2.2 - я не знаю, есть ли какие-то последствия для 3.0.
Вы можете найти мой другой вопрос по этой проблеме из моего первого приложения здесь: Вопрос StackOverflow о кешировании UIImage
Еще одно замечание - InterfaceBuilder использует imageNamed под покровом. О чем следует помнить, если вы столкнетесь с этой проблемой.
источник