Как управляется время жизни объектов в NSCache?

«Как управляется время жизни объектов в NSCache?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

NSCache — это изменяемая коллекция, которая автоматически удаляет объекты при нехватке памяти в системе (реагирует на уведомления о memory pressure). Точное время жизни объекта не гарантируется.

Основные механизмы управления:

  1. Автоочистка по памяти: Основная особенность. Кэш очищается системой, когда приложение получает предупреждение о нехватке памяти.
  2. Лимиты: Вы можете задать дополнительные ограничения.
    • countLimit: Максимальное количество объектов.
    • totalCostLimit: Максимальная "стоимость" всех объектов в кэше. Стоимость задаётся при добавлении (setObject(_:forKey:cost:)).
  3. Поведение при достижении лимита: Удаление наименее используемых объектов происходит не сразу, а по усмотрению кэша.

Пример использования:

let imageCache = NSCache<NSString, UIImage>()
imageCache.name = "ImageCache"
imageCache.countLimit = 100
imageCache.totalCostLimit = 50 * 1024 * 1024 // 50 МБ

// Добавление с указанием "стоимости" (например, размер данных)
if let imageData = image.pngData() {
    imageCache.setObject(image, forKey: "profilePic", cost: imageData.count)
}

// Получение
if let cachedImage = imageCache.object(forKey: "profilePic") {
    // Использовать изображение
}

// Удаление
imageCache.removeObject(forKey: "profilePic")

Важно: NSCache не является потокобезопасным. Доступ к нему из нескольких потоков должен быть синхронизирован.