Sobes.tech
Middle+

Jak byste implementovali čištění paměti pomocí uložených typů a klíčů?

sobes.tech AI

Odpověď od AI

Použil bych NSCache nebo specializované správce cache. NSCache automaticky spravuje paměť a při nedostatku uvolňuje objekty.

Příklad s NSCache:

import Foundation

class DataCache {
    private let cache = NSCache<NSString, NSData>() // Cache pro data

    func setData(_ data: Data, forKey key: String) {
        let nsKey = key as NSString
        let nsData = data as NSData
        cache.setObject(nsData, forKey: nsKey) // Uložit data pod klíčem
    }

    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ískat data podle klíče
    }

    func removeData(forKey key: String) {
        let nsKey = key as NSString
        cache.removeObject(forKey: nsKey) // Odstranit data podle klíče
    }

    func removeAllData() {
        cache.removeAllObjects() // Vymazat celý cache
    }
}

NSCache má výhody oproti NSDictionary nebo Swift.Dictionary pro cache:

  • Automatické odstraňování: Odstraňuje objekty při nedostatku paměti.
  • Bezpečnost v multi-thread prostředí: Bezpečný pro použití z různých vláken.
  • Slabé odkazy: Neudržuje silné odkazy na objekty, což zabraňuje únikům paměti.

Pro složitější logiku cache (například s expirací nebo omezením velikosti) si můžete vytvořit vlastní třídu správce, která obaluje NSCache, nebo použít jiné mechanismy (například ukládání na disk s řízením přes souborový systém).