Назад к вопросам
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 или использовать другие механизмы (например, хранение на диске с управлением через файловую систему).