Sobes.tech
Junior — Middle

Come implementare la memorizzazione di oggetti usando riferimenti deboli in una collezione?

sobes.tech AI

Risposta dell'AI

Su iOS, per memorizzare oggetti tramite riferimenti deboli nelle collezioni, è possibile utilizzare diversi approcci, poiché le collezioni standard (ad esempio, Array, Set, Dictionary) memorizzano riferimenti forti agli oggetti, il che può portare a mantenere gli oggetti in memoria più a lungo del necessario.

Principali metodi:

  1. Utilizzo di un wrapper con proprietà weak

Viene creata una classe wrapper che contiene un riferimento debole all'oggetto. Questi wrapper vengono aggiunti alla collezione invece degli oggetti stessi.

class WeakRef<T: AnyObject> {
    weak var value: T?
    init(value: T) {
        self.value = value
    }
}

var weakArray = [WeakRef<MyClass>]()

let obj = MyClass()
weakArray.append(WeakRef(value: obj))
  1. Utilizzo di NSHashTable o NSMapTable

Queste classi di Foundation permettono di memorizzare riferimenti deboli direttamente.

let weakSet = NSHashTable<MyClass>.weakObjects()
weakSet.add(obj)

NSHashTable con l’opzione weakObjects memorizza automaticamente gli oggetti deboli, e quando un oggetto viene deallocato, viene rimosso dalla collezione.

In questo modo, per memorizzare oggetti deboli nelle collezioni in iOS, si utilizzano comunemente NSHashTable o wrapper con proprietà weak.