Sobes.tech
Middle+

Ako by ste implementovali čiščenje pamäti pomocou uložených typov a kľúčov?

sobes.tech AI

Odpoveď od AI

Použil by som NSCache alebo špecializovaných správcu cache. NSCache automaticky spravuje pamäť a pri nedostatku uvoľňuje objekty.

Príklad s NSCache:

import Foundation

class DataCache {
    private let cache = NSCache<NSString, NSData>() // Cache pre dáta

    func setData(_ data: Data, forKey key: String) {
        let nsKey = key as NSString
        let nsData = data as NSData
        cache.setObject(nsData, forKey: nsKey) // Uložiť dáta podľa kľúča
    }

    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 // Získať dáta podľa kľúča
    }

    func removeData(forKey key: String) {
        let nsKey = key as NSString
        cache.removeObject(forKey: nsKey) // Odstrániť dáta podľa kľúča
    }

    func removeAllData() {
        cache.removeAllObjects() // Vyčistiť celý cache
    }
}

NSCache má výhody oproti NSDictionary alebo Swift.Dictionary pre cache:

  • Automatické odstraňovanie: Odstraňuje objekty pri nedostatku pamäti.
  • Bezpečnosť v multi-thread prostredí: Bezpečný na použitie z rôznych vlákien.
  • Slabé odkazy: Neudržiava silné odkazy na objekty, čím zabraňuje únikom pamäti.

Pre zložitejšiu logiku cache (napríklad s expiráciou alebo obmedzením veľkosti) si môžete vytvoriť vlastnú triedu správcu, ktorá obaluje NSCache, alebo použiť iné mechanizmy (napríklad ukladanie na disk s riadením cez súborový systém).