Sobes.tech
Middle+

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

sobes.tech AI

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