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).