> Что такое кэш и как он работает (iOS, Swift)
Уровень: junior · Роль: mobile · Категория: Технические вопросы
Компании: Wildberries, VK
Стек: iOS, Swift
> Пример ответа
Короткий ответ
Кэш - это промежуточное хранилище данных, которое ускоряет доступ к часто используемой информации за счёт сокращения времени чтения из медленного источника (сеть, диск, база данных). В iOS кэширование применяется для изображений, сетевых ответов и вычислений. Работа строится на принципе локальности: если данные запросили один раз, вероятность повторного запроса высока. Кэш хранит копию данных в быстрой памяти и при следующем обращении отдаёт её без обращения к исходному источнику.
Подробное объяснение
Кэш - это механизм, который сохраняет копию данных в быстродоступном хранилище (RAM, диск) после первого получения из медленного источника. Основная цель - уменьшить задержки и нагрузку на сеть или процессор.
Ключевые элементы работы кэша:
- Ключ (key) - уникальный идентификатор данных (URL, hash, identifier).
- Значение (value) - сами данные (Data, UIImage, JSON).
- Время жизни (TTL) - период, после которого запись считается устаревшей.
- Политика вытеснения - правило удаления старых записей при переполнении (LRU, FIFO, LFU).
Процесс обращения к кэшу:
- При запросе данных сначала проверяется кэш по ключу.
- Если запись найдена и не истекла - возвращается копия (cache hit).
- Если записи нет или она устарела - выполняется запрос к источнику (cache miss), результат сохраняется в кэш и возвращается.
В iOS нативный инструмент - NSCache. Он автоматически управляет памятью и удаляет объекты при нехватке ресурсов. Для дискового кэша используют URLCache (для сетевых запросов) или библиотеки типа Kingfisher, SDWebImage.
Важно понимать: кэш - это trade-off между скоростью и актуальностью данных. Чем дольше TTL, тем выше риск показать устаревшую информацию.
На практике
В мобильной разработке кэш применяется в трёх основных сценариях:
- Сетевые запросы - сохранение ответов API, чтобы повторно не грузить данные при медленном интернете.
- Изображения - загрузка аватарок, картинок в ленте; без кэша каждый скролл вызывал бы сетевой запрос.
- Тяжёлые вычисления - результат парсинга, обработки изображения, шифрования.
Для junior-позиции достаточно понимать NSCache и URLCache. В реальном проекте часто используют готовые решения, но принцип одинаков: сначала проверяем память, потом диск, потом сеть.
При работе с кэшем нужно учитывать:
- Размер - ограничивать количество объектов, чтобы не исчерпать память.
- Актуальность - при обновлении данных на сервере очищать или инвалидировать кэш.
- Потокобезопасность -
NSCacheпотокобезопасен, но при работе с диском нужна синхронизация.
Пример кода
SWIFTimport Foundationfinal 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.sharedlet 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безопасен, а вот собственные реализации на файловой системе требуют синхронизации.
> Похожие задачи по mobile
Какие средства синхронизации потоков существуют: mutex, semaphore, NSLock
Какие механизмы синхронизации существуют для решения проблем многопоточности
Что такое Map и Set в JavaScript
Что такое ViewModel во Vue и как он работает
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью