TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.65K subscribers
Post #410 1.08K
🔢 NSCache в Swift: как правильно кэшировать и не бояться утечек памяти.

NSCache - встроенный в Foundation механизм для кэширования данных в памяти. В отличие от обычного словаря, NSCache сам очищается при нехватке памяти, потокобезопасен и не вызывает циклов сильных ссылок. Для задач вроде кэширования картинок, разобранного текста или результатов парсинга это отличный выбор.


В чем подвох:

NSCache пришел из Objective-C, поэтому и ключи, и значения должны быть ссылочными типами (AnyObject). String и Int так просто не положить - нужно оборачивать в NSString или NSNumber. На практике это неудобно, но решается оберткой.


Как сделать удобную обертку:

Можно написать generic-класс Cache<Key: Hashable, Value>, который внутри хранит NSCache<WrappedKey, Entry>. WrappedKey - класс-обертка для ключа, Entry - для значения. Благодаря этому можно будет работать с обычными типами (String, Int и другими структурами).


Важные ограничения:

На проде почти всегда нужно задавать countLimit и totalCostLimit. Иначе кэш может незаметно разрастись и занять всю память. totalCostLimit - примерная граница суммарного размера объектов. cost при вставке - абстрактная метрика. Для изображений можно использовать width * height, для текста - count (length). Главное, чтобы более объемные объекты удалялись из кэша в первую очередь.


Когда NSCache подходит:

🔹Кэширование изображений в таблицах и коллекциях.

🔹Результаты разбора Markdown в NSAttributedString.

🔹Тяжелые вычисления (фильтры, предикты).

🔹Результаты парсинга, которые не критично потерять.


Когда не подходит:

🔹Данные, которые должны переживать перезапуск приложения (здесь нужно сохранять в память).

🔹Кэш с TTL (временем жизни).

🔹Сетевые ответы с управлением через заголовки (для этого есть URLCache).


🔗 Читать подробнее


💡 Вывод:

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


Подписаться на канал:
➡️ Telegram | Max

Закрытый канал:
🚀 Мобильный трудоголик PRO
  • 👍 12
  • ❤ 4
  • 🙏 1
  • 🤝 1
More from @hardworkerit
  1. Oct 1, 2026🔢 Работа с Picture-in-Picture в iOS. Picture-in-Picture - системная функция iOS, которая…
  2. Sep 29, 2026🔢 Управление тулбарами на iPhone Duo. На iPhone Duo элементы управления навигацией, дейст…
  3. Sep 27, 2026🔢 Новые возможности Hashable в Swift 6.4 В Swift 6.4 добавили Hashable для нескольких тип…
  4. Sep 25, 2026🔢 Приватные свойства больше не ломают memberwise инициализатор в Swift 6.4 Swift автомати…
  5. Sep 24, 2026👨‍💻 Почему разработчики ненавидят своих менеджеров. Всем привет! Сегодня хочу разобрать…
  6. Sep 22, 2026🔢 Релиз Swift 6.4: главные изменения для разработчиков. Swift 6.4 вышел. Это обновление п…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →