Posso ligar quando um objeto com pouca referência (do tipo arbitrário) é liberado?
Estou escrevendo uma classe de contêiner no Swift, que funciona comojava.util.WeakHashMap
em Java. Minha implementação atual está aqui.
class WeakRefMap<Key: Hashable, Value: AnyObject> {
private var mapping = [Key: WeakBox<Value>]()
subscript(key: Key) -> Value? {
get { return mapping[key]?.raw }
set {
if let o = newValue {
mapping[key] = WeakBox(o)
}
else {
mapping.removeValueForKey(key)
}
}
}
var count: Int { return mapping.count }
}
class WeakBox<E: AnyObject> {
weak var raw: E!
init( _ raw: E) { self.raw = raw }
}
Nesta implementação, os objetos retidos no contêiner são pouco referenciados viaWeakBox
, portanto, manter valores nunca impede que os objetos sejam liberados quando não forem mais necessários.
Mas claramente há um problema nesse código; As entradas permanecem mesmo depois que o objeto de sua entrada é liberado.
Para resolver esse problema, eu preciso conectar um pouco antes de um objeto em espera ser liberado e remover sua entrada (correspondente). Eu conheço uma solução apenas paraNSObject
, mas não é aplicável aAnyObject
.
Alguém pode ajudar-me? Obrigado. (^_^)