В чем разница между хранением изображения как UIImage и как Data в iOS?

«В чем разница между хранением изображения как UIImage и как Data в iOS?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор между UIImage и Data для работы с изображениями зависит от этапа жизненного цикла: хранение/передача или отображение.

Data (Данные)

  • Что это: Бинарное представление закодированного изображения (например, JPEG, PNG).
  • Память: Занимает меньше места (размер файла).
  • Назначение: Идеально для хранения (в файловой системе, базе данных), передачи по сети и сериализации (например, сохранения в UserDefaults или Codable).
  • Не может быть напрямую отображено на экране.
// Получение Data (например, из сети или файла)
let imageData = try Data(contentsOf: fileURL)

// Сохранение в UserDefaults (сериализация)
UserDefaults.standard.set(imageData, forKey: "cachedImage")

UIImage

  • Что это: Объект UIKit, представляющий декодированное растровое изображение, готовое к рендерингу.
  • Память: Занимает значительно больше оперативной памяти. Размер ~ width * height * 4 байт (для формата RGBA).
  • Назначение: Используется исключительно для отображения в UIImageView, рисования в графическом контексте (UIGraphicsImageRenderer).
  • Не является Codable и не может быть напрямую сохранен.
// Декодирование Data в UIImage для отображения
if let image = UIImage(data: imageData) {
    imageView.image = image // Теперь можно показать
}

Практический паттерн работы

  1. Хранить и передавать изображения в формате Data (сжатом).
  2. Декодировать Data в UIImage только в момент необходимости отображения.
  3. Использовать кэширование (например, NSCache<NSString, UIImage>) для уже декодированных изображений, чтобы избежать повторной дорогостоящей декодировки.

Почему это важно? Декодирование Data в UIImage — ресурсоемкая операция. Хранение множества декодированных UIImage в памяти быстро приводит к ее исчерпанию и падению приложения. Всегда держите тяжелые UIImage в памяти только тогда, когда они видны на экране или скоро понадобятся.