Я пишу контейнерный класс в Swift, который работает как java.util.WeakHashMap
в Java. Моя текущая реализация здесь.Можно ли подключить, когда освобожден объект с низкой ссылкой (произвольного типа)?
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 }
}
В этой реализации holded объектов в контейнере слабо ссылки через WeakBox
, поэтому проведение значения не предотвращает объекты от освобождения, когда больше не нужно.
Но ясно, что в этом коде есть проблема; Записи остаются даже после того, как объект его записи освобожден.
Чтобы решить эту проблему, мне нужно зацепить ее перед тем, как освобожденный объект будет выпущен, и удалите его (соответствующую) запись. Я знаю решение только для NSObject
, но оно неприменимо к AnyObject
.
Может ли кто-нибудь мне помочь? Благодарю. (^_^)
Попробуйте использовать метод 'deinit' - см. [Документы Apple здесь] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html). – pbasdf
Смотрите это: http://stackoverflow.com/questions/25497928/dealloc-in-swift – Ian
Спасибо. Но это не то, что я имел в виду. Класс контейнера, который я создал, является общим классом, поэтому для всех подтипов «AnyObject» он должен работать как «Значение». Подход 'deinit' применим только тогда, когда тип разрешима. – findall