Назад к вопросам
Middle+
79
questionbank

Как бы вы реализовали очистку памяти через хранимые типы и ключ?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Использовал бы NSCache или специализированные менеджеры кэша. NSCache автоматически управляет памятью, выгружая объекты при нехватке.

Пример с NSCache:

import Foundation

class DataCache {
    private let cache = NSCache<NSString, NSData>() // Кэш для данных

    func setData(_ data: Data, forKey key: String) {
        let nsKey = key as NSString
        let nsData = data as NSData
        cache.setObject(nsData, forKey: nsKey) // Сохранить данные по ключу
    }

    func getData(forKey key: String) -> Data? {
        let nsKey = key as NSString
        guard let nsData = cache.object(forKey: nsKey) else {
            return nil
        }
        return nsData as Data // Получить данные по ключу
    }

    func removeData(forKey key: String) {
        let nsKey = key as NSString
        cache.removeObject(forKey: nsKey) // Удалить данные по ключу
    }

    func removeAllData() {
        cache.removeAllObjects() // Очистить весь кэш
    }
}

NSCache имеет преимущества над NSDictionary или Swift.Dictionary для кэширования:

  • Автоматическое удаление: Удаляет объекты при нехватке памяти.
  • Потокоустойчивость: Безопасен для использования из разных потоков.
  • Слабые ссылки: Не держит сильные ссылки на объекты, что предотвращает утечки памяти.

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