【发布时间】:2015-02-23 09:45:49
【问题描述】:
我正在用 Swift 编写一个容器类,它的工作方式类似于 Java 中的 java.util.WeakHashMap。我当前的实现在这里。
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 }
}
在此实现中,容器中持有的对象通过WeakBox 进行弱引用,因此持有值永远不会阻止对象在不再需要时被释放。
但显然这段代码有问题;即使在其条目的对象被释放后,条目仍然存在。
要解决这个问题,我需要在释放持有的对象之前进行挂钩,并删除其(相应的)条目。我只知道NSObject 的解决方案,但不适用于AnyObject。
谁能帮帮我?谢谢。 (^_^)
【问题讨论】:
-
尝试使用
deinit方法 - 请参阅Apple Docs here。 -
谢谢。但这不是我的意思。我制作的容器类是一个泛型类,因此它需要像
Value一样适用于AnyObject的所有子类型。deinit方法仅适用于类型可确定的情况。 -
看来Swift类没办法了,对比stackoverflow.com/questions/24317332/…。
标签: ios swift dictionary weak-references