0
A
回答
1
仅供参考,并不必要,Signal
将被布置和停止转发事件。
Signal
是一个类型,如果没有人有对它的引用,应当DEINIT。 然而,Signal
实现引入了一个棘手的办法留住自己,看到state
财产,因此有暂时存在一些内存泄漏。从源代码可以看出,如果有一些观察者在Signal
上订阅,它的确依次保留它,直到所有观察者退订或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
类型,你不应该考虑它的使用寿命。
相关问题
- 1. 如何将信号和SignalProducer合并到ReactiveSwift的信号中?
- 2. 保留或不保留
- 3. combineLatest行为中的差异信号v SignalProducer(ReactiveCocoa 4)
- 4. 保留TabBarController信息
- 5. 保留对星号
- 6. ReactiveCocoa:与Signal或SignalProducer绑定的区别?
- 7. Django保留注册信息
- 8. SignalProducer的状态
- 9. Reactivecocoa 4 SignalProducer
- 10. 保留卷序列号
- 11. MySQL-Masking信用卡号码,但保留连字符
- 12. 解析XML文件并保留有关行号的信息
- 13. 信号/插槽传输后无法保留数据
- 14. EXC_BAD_ACCESS复制或保留块
- 15. 留下二进制信号量锁定
- 16. Laravel作业和保留状态或保留队列
- 17. 保持恒定信号
- 18. Django预保存信号
- 19. 在回发后保留PreviousPage信息
- 20. 使用OAuth时保留登录信息
- 21. 保留可可中的信息?
- 22. Django从页面导航,保留信息
- 23. 有状态EJB不保留信息
- 24. 保留文件信息,而在PHP
- 25. Wt ::信号或绑定?
- 26. Java:使用URLDecoder,但保留加号(+)
- 27. 回声但保留双引号
- 28. 保留括号内的文字只有
- 29. sed替换并保留双引号
- 30. JSON中发送的保留撇号