Опишите ситуацию, когда ваше техническое решение привело к серьёзной проблеме, и что вы извлекли из этого.

«Опишите ситуацию, когда ваше техническое решение привело к серьёзной проблеме, и что вы извлекли из этого.» — вопрос из категории Софт-скиллы, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Ситуация: Перед срочным релизом я решил «улучшить» кеширование изображений, добавив поверх 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 и крашилось, так как не освобождало ресурсы.

Решение и выводы:

  1. Срочный фикс: Добавление реакции на системное уведомление о нехватке памяти.
    NotificationCenter.default.addObserver(forName: UIApplication.didReceiveMemoryWarningNotification,
                                           object: nil,
                                           queue: .main) { [weak self] _ in
        self?.storage.removeAll() // Очистка кеша
    }
  2. Архитектурный вывод: Не изобретать велосипед без необходимости. SDWebImage и NSCache уже имеют встроенные механизмы управления памятью.
  3. Процессный вывод: Любые оптимизации, особенно касающиеся памяти, требуют профилирования (Instruments) и тестирования на целевых устройствах (особенно с малым объемом памяти) перед попаданием в релиз. Нельзя вносить такие изменения в последний момент.