FYI, не обязательно, 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
тип, и вы не должны учитывать его продолжительность жизни.