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.