我有一个Process对象(有点像Model(。在一个过程中,我有一个元组数组
var listeners: [(WeakContainer<AnyObject>, (S) -> ())]
WeakContainer
处理内部的弱引用。当Conainer的值变为nil时,我需要从listeners
数组中移除一个元素。我的代码如下:
class Process<S> {
typealias Handler = (S) -> ()
typealias Listener = (container: Weak<AnyObject>, handler: StateHandler)
var listeners: [Listener] = []
private let runLoop = RunLoop()
init() {
runLoop.run(mode: .default, before: .now)
runLoop.perform { [weak self] in
self?.state.listeners.removeAll {
$0.container.value == nil
}
}
}
}
我的目标是否正确使用RunLoop?为什么?如果你能为我的情况提出一个更合适的替代方案(对物体的跟踪变为零(,我将不胜感激。
有一个NSMapTable
集合,它可以灵活地配置各种内存保留策略。
下面是一个如何用弱键对象存储Handler
对象的示例。Handler
将被保留,直到密钥存在,并且在密钥删除时,该对将从集合中删除。
class Handler<Action> {
let action: Action
init(_ action: Action) {
self.action = action
}
}
var listeners = NSMapTable<AnyObject, Handler<(S)->Void>> (keyOptions: [.weakMemory, .objectPointerPersonality],
valueOptions: .strongMemory)