Sobes.tech
Junior — Middle

Como deve guardar objetos usando referências fracas dentro de coleções?

sobes.tech IA

Resposta da IA

Para guardar objetos usando referências fracas dentro de coleções no iOS (Swift ou Objective-C), normalmente usam-se contêineres especiais que não mantêm referências fortes aos objetos, para evitar ciclos de retenção e fugas de memória.

Em Swift, pode-se usar NSHashTable ou NSMapTable com a opção de referências fracas:

let weakSet = NSHashTable<AnyObject>.weakObjects()
weakSet.add(someObject)

Isto permite armazenar objetos sem aumentar o contador de referências, e quando o objeto é libertado, ele é removido automaticamente da coleção.

Se usar coleções normais (por exemplo, arrays), pode envolver os objetos numa estrutura auxiliar para referências fracas:

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

var weakArray: [WeakRef<MyClass>] = []
weakArray.append(WeakRef(value: someObject))

Desta forma, a coleção mantém referências fracas, e os objetos podem ser libertados quando já não têm referências fortes.