DisposeBag 资源回收源码解析
举例
//在ViewController 创建一个disposeBag 垃圾回收对象;
var disposeBag: DisposeBag()
//创建一个Observable
let observable = Observable.of("A", "B", "C")
//监听Observable,并通过disposeBag管理其生命周期
observable.subscribe(onNext: { (element) in
print(element)
}).disposed(by: disposeBag)
-
Observable 调用 subscribe()方法 返回值 是Disposable 对象;
//代码如下 public override func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == Element { ... }
-
Disposable.swift 扩展了一个disposed()方法,就是上面案例用到的方法,DisposeBag将Disposable 加入到了自己的 _disposables: 数组中 (专门存放DisposeBag将Disposable 的数组);
extension Disposable { /// Adds `self` to `bag` /// /// - parameter bag: `DisposeBag` to add `self` to. public func disposed(by bag: DisposeBag) { bag.insert(self) } }
3.从 DisposeBag 的定义来看是这样的,DisposeBag 有一个专门存放垃圾回收的 _disposables 数组;和一个表示当前对象是否被回收的属性值_isDisposed (默认是false);
public final class DisposeBag: DisposeBase {
private var _lock = SpinLock()
fileprivate var _disposables = [Disposable]()
fileprivate var _isDisposed = false
public override init() {
super.init()
}
}
- 当 DisposeBag 的生命周期在Viewcontroller 中结束的时候,调用自身的 deinit,随后调用 self.dispose();
deinit {
self.dispose()
}
private func dispose() {
//此处获取_disposables 数组对象
let oldDisposables = self._dispose()
for disposable in oldDisposables {
disposable.dispose()
}
}
-
紧接着 会将_isDisposed 变成ture,然后循环遍历 _disposables 数组,并将Disposable对象都调用 dispose() 方法进行释放
-
完
网友评论