Ответ
Ситуация: Перед срочным релизом я решил «улучшить» кеширование изображений, добавив поверх SDWebImage простой in-memory кеш в виде синглтона, чтобы избежать повторных декодирований одних и тех же картинок.
Исходная проблемная реализация:
class CustomImageCache {
static let shared = CustomImageCache()
private var storage = [String: UIImage]() // Словарь в памяти
func image(for key: String) -> UIImage? {
return storage[key]
}
func insert(_ image: UIImage, for key: String) {
storage[key] = image // НЕТ ЛИМИТА И ОЧИСТКИ!
}
}
Проблема: Кеш бесконтрольно рос в памяти. На устройствах с небольшим объемом ОЗУ при загрузке галереи изображений приложение получало memory warning и крашилось, так как не освобождало ресурсы.
Решение и выводы:
- Срочный фикс: Добавление реакции на системное уведомление о нехватке памяти.
NotificationCenter.default.addObserver(forName: UIApplication.didReceiveMemoryWarningNotification, object: nil, queue: .main) { [weak self] _ in self?.storage.removeAll() // Очистка кеша } - Архитектурный вывод: Не изобретать велосипед без необходимости.
SDWebImageиNSCacheуже имеют встроенные механизмы управления памятью. - Процессный вывод: Любые оптимизации, особенно касающиеся памяти, требуют профилирования (Instruments) и тестирования на целевых устройствах (особенно с малым объемом памяти) перед попаданием в релиз. Нельзя вносить такие изменения в последний момент.