我有一个流程对象(是某种模型)。在进程中,我有一个元组数组。
var listeners: [(WeakContainer<AnyObject>, (S) -> ())]WeakContainer处理内部的弱引用。当Conainer的值变为0时,我需要从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?为什么?如果你能为我的情况提出一个更合适的替代方案,我将不胜感激(对目标的跟踪变为零)。
发布于 2022-09-09 10:39:22
有一个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)https://stackoverflow.com/questions/73660147
复制相似问题