Swift

DisposeBag 资源源码解析

2020-02-27  本文已影响0人  pengxiaochao

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)
  1. Observable 调用 subscribe()方法 返回值 是Disposable 对象;

     //代码如下
     public override func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == Element {
         ...
     }
    
  2. 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()
}

}
  1. 当 DisposeBag 的生命周期在Viewcontroller 中结束的时候,调用自身的 deinit,随后调用 self.dispose();
deinit {
    self.dispose()
}

private func dispose() {
    //此处获取_disposables 数组对象
    let oldDisposables = self._dispose()

    for disposable in oldDisposables {
        disposable.dispose()
    }
}
  1. 紧接着 会将_isDisposed 变成ture,然后循环遍历 _disposables 数组,并将Disposable对象都调用 dispose() 方法进行释放

上一篇下一篇

猜你喜欢

热点阅读