我是否有责任维护对Signal
或SignalProducer
的引用,例如,使用实例变量?
换句话说,当它们被解除分配时,它们会自动消失并停止发送事件吗?
答案 0 :(得分:1)
仅供参考,没有必要,Signal
将被处置并停止转发事件。
Signal
是一个类类型,如果没有人引用它,它应该是deinit。
但是,Signal
实现引入了一种保留自身的棘手方法,请参阅state
属性,以便临时存在一些内存泄漏。如源代码所示,如果Signal
上有一些观察者订阅,则state
会依次保留它,直到所有观察者都取消订阅或Signal
收到已完成/错误/中断事件。
这里有一些标记的代码段。
// definition of SignalState
private struct SignalState<Value, Error: Swift.Error> {
var observers: Bag<Signal<Value, Error>.Observer> = Bag()
var retainedSignal: Signal<Value, Error>? // here is the key
}
public func observe(_ observer: Observer) -> Disposable? {
var token: RemovalToken?
state.modify {
$0?.retainedSignal = self // retain self when one observer on
token = $0?.observers.insert(observer)
}
if let token = token {
return ActionDisposable { [weak self] in
if let strongSelf = self {
strongSelf.state.modify { state in
state?.observers.remove(using: token)
if state?.observers.isEmpty ?? false {
// break retain cycle when disposed
state!.retainedSignal = nil
}
}
}
}
} else {
observer.sendInterrupted()
return nil
}
}
SignalProducer
怎么样?
它非常直观,SignalProducer
只是struct
类型,你不应该考虑它的生命周期。