> Что такое кэш и как он работает (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Wildberries, VK

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Кэш - это промежуточное хранилище данных, которое ускоряет доступ к часто используемой информации за счёт сокращения времени чтения из медленного источника (сеть, диск, база данных). В iOS кэширование применяется для изображений, сетевых ответов и вычислений. Работа строится на принципе локальности: если данные запросили один раз, вероятность повторного запроса высока. Кэш хранит копию данных в быстрой памяти и при следующем обращении отдаёт её без обращения к исходному источнику.

Подробное объяснение

Кэш - это механизм, который сохраняет копию данных в быстродоступном хранилище (RAM, диск) после первого получения из медленного источника. Основная цель - уменьшить задержки и нагрузку на сеть или процессор.

Ключевые элементы работы кэша:

  • Ключ (key) - уникальный идентификатор данных (URL, hash, identifier).
  • Значение (value) - сами данные (Data, UIImage, JSON).
  • Время жизни (TTL) - период, после которого запись считается устаревшей.
  • Политика вытеснения - правило удаления старых записей при переполнении (LRU, FIFO, LFU).

Процесс обращения к кэшу:

  1. При запросе данных сначала проверяется кэш по ключу.
  2. Если запись найдена и не истекла - возвращается копия (cache hit).
  3. Если записи нет или она устарела - выполняется запрос к источнику (cache miss), результат сохраняется в кэш и возвращается.

В iOS нативный инструмент - NSCache. Он автоматически управляет памятью и удаляет объекты при нехватке ресурсов. Для дискового кэша используют URLCache (для сетевых запросов) или библиотеки типа Kingfisher, SDWebImage.

Важно понимать: кэш - это trade-off между скоростью и актуальностью данных. Чем дольше TTL, тем выше риск показать устаревшую информацию.

На практике

В мобильной разработке кэш применяется в трёх основных сценариях:

  • Сетевые запросы - сохранение ответов API, чтобы повторно не грузить данные при медленном интернете.
  • Изображения - загрузка аватарок, картинок в ленте; без кэша каждый скролл вызывал бы сетевой запрос.
  • Тяжёлые вычисления - результат парсинга, обработки изображения, шифрования.

Для junior-позиции достаточно понимать NSCache и URLCache. В реальном проекте часто используют готовые решения, но принцип одинаков: сначала проверяем память, потом диск, потом сеть.

При работе с кэшем нужно учитывать:

  • Размер - ограничивать количество объектов, чтобы не исчерпать память.
  • Актуальность - при обновлении данных на сервере очищать или инвалидировать кэш.
  • Потокобезопасность - NSCache потокобезопасен, но при работе с диском нужна синхронизация.

Пример кода

SWIFT
import Foundation
final class ImageCache {
static let shared = ImageCache()
private let cache = NSCache<NSString, UIImage>()
private init() {
cache.countLimit = 100 // максимум 100 изображений
cache.totalCostLimit = 50 * 1024 * 1024 // 50 MB
}
func image(forKey key: String) -> UIImage? {
return cache.object(forKey: key as NSString)
}
func setImage(_ image: UIImage, forKey key: String) {
cache.setObject(image, forKey: key as NSString)
}
func removeImage(forKey key: String) {
cache.removeObject(forKey: key as NSString)
}
func clear() {
cache.removeAllObjects()
}
}
// Использование
let cache = ImageCache.shared
let key = "profile_avatar_123"
if let cachedImage = cache.image(forKey: key) {
// используем кэшированное изображение
} else {
// загружаем из сети, затем сохраняем
// cache.setImage(image, forKey: key)
}

Как отвечать на собеседовании

Начни с простого определения: кэш - это хранилище копий данных для ускорения доступа. Затем опиши процесс: проверка ключа, hit/miss, сохранение результата. Упомяни NSCache как основной инструмент в iOS и его особенности - автоматическое освобождение памяти, потокобезопасность.

Приведи пример из практики: загрузка изображений в таблице. Объясни, почему без кэша приложение тормозит - каждый скролл создаёт сетевой запрос. Скажи, что для сетевых ответов есть URLCache, который работает на уровне URLSession.

Если спросят про инвалидацию - ответь, что при logout или обновлении данных нужно очищать кэш. Можно упомянуть TTL как способ контроля актуальности.

Не углубляйся в алгоритмы вытеснения, если не спрашивают. Для junior достаточно знать, что NSCache сам решает, что удалить при нехватке памяти.

Что проверяет интервьюер

Интервьюер оценивает:

  • Понимание базовой концепции - зачем нужен кэш и как он ускоряет работу.
  • Знание iOS-инструментов - NSCache, URLCache, отличие памяти от диска.
  • Умение объяснить trade-off - скорость против актуальности данных.
  • Практическое мышление - где в приложении кэш нужен, а где вреден.
  • Понимание ограничений - кэш не решает проблему медленного первого запуска, не заменяет оптимизацию запросов.

Хороший ответ показывает, что кандидат не просто заучил определение, а понимает, когда и зачем применять кэш в реальном проекте.

Типичные ошибки

  • Путаница между кэшем и базой данных - кэш не является источником истины, это временная копия.
  • Игнорирование актуальности - хранение данных бесконечно долго приводит к устаревшей информации.
  • Отсутствие ограничений - без countLimit и totalCostLimit кэш может съесть всю память.
  • Кэширование всего подряд - не все данные нужно кэшировать, например, токены или чувствительные данные хранить в кэше нельзя.
  • Забывают про очистку - при выходе из аккаунта кэш нужно инвалидировать, иначе данные одного пользователя увидит другой.
  • Не учитывают потокобезопасность при работе с дисковым кэшем - NSCache безопасен, а вот собственные реализации на файловой системе требуют синхронизации.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью