Разница между [UIImage imageNamed…] и [UIImage imageWithData…]?

Я хочу загрузить некоторые изображения в мое приложение из файловой системы. Есть 2 простых способа сделать это:

[UIImage imageNamed:fullFileName]

или:

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];

[UIImage imageWithData:imageData];

Я предпочитаю первый, потому что он намного меньше кода, но я видел, как некоторые люди говорили, что изображение кэшируется и что этот метод использует больше памяти? Поскольку я не доверяю людям на большинстве других форумов, я подумал, что задам вопрос здесь, есть ли практическая разница, и если да, то какой из них «лучше»?

Я попытался профилировать свое приложение. используя инструмент «Распределение объектов», и я не вижу никакой практической разницы, хотя я пробовал только в симуляторе, а не на самом iPhone.

65
задан 28.03.2020, 06:23

4 ответа

Это зависит от того, что Вы делаете с изображением. imageNamed: метод действительно кэширует изображение, но во многих случаях это собирается помочь с использованием памяти. Например, при загрузке изображения 10 раз для отображения наряду с некоторым текстом в табличном представлении, UIImage только сохранит единственное представление того изображения в памяти вместо того, чтобы выделить 10 отдельных объектов. С другой стороны, если у Вас есть очень большое изображение, и Вы не снова используете его, Вы могли бы хотеть загрузить изображение из объекта данных удостовериться, что оно удалено из памяти, когда Вы сделаны.

, Если бы у Вас нет огромных изображений, я не волновался бы об этом. Если Вы не видите проблемы (и престижность за проверку Объектного Выделения вместо того, чтобы заблаговременно оптимизировать), я предпочел бы меньше строк кода незначительным улучшениям памяти.

91
ответ дан 28.03.2020, 06:24
  • 1
    Посмотрите ролик в ответе выше для изучения отладки:-), – Mark Mooibroek 14.04.2011, 13:12
  • 2
    Это будет выпущено автоматически если there' s низкое предупреждение памяти. – Nick Lockwood 28.03.2020, 06:24
  • 3
    У меня есть вопрос, после того, как я использовал imageNamed, он кэширует изображения, хорошо, тогда, что я должен сделать для выпуска того кэшируемого изображения из памяти? Будет это автовыпустило? Спасибо – Almas Adilbek 28.03.2020, 06:24

По моему опыту [UIImage imageNamed:] имеет существенно лучшую производительность, особенно при использовании в UITableViews.

Это не просто память, но также и декодирование image. Кэширование его намного быстрее.

10
ответ дан 28.03.2020, 06:23
  • 1
    Еще более важный reuseIdentifier на ячейках - если Вы don' t производительность ячеек таблицы повторного использования пострадает. – Kendall Helmstetter Gelner 28.03.2020, 06:23

imageWithData полезен при хранении двоичного файла изображения в базе данных или прогрессивно загрузке большого изображения от сети.

3
ответ дан 28.03.2020, 06:25

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

5
ответ дан 28.03.2020, 06:25
  • 1
    Я думаю, что это устарело теперь. – Rog 28.03.2020, 06:26
  • 2
    Я вошел в проблему с кэшированием. Мое приложение загружало изображения, затем перезаписывая файл изображения, и это закончило тем, что вызвало действительно странно испорченные изображения и страшные сообщения отладки из библиотеки JPEG. – Chris Lundie 28.03.2020, 06:26

Теги

Похожие вопросы