RxSwift学习(8)dispose

2019-08-07  本文已影响0人  忆痕无殇

RxSwift的销毁者。为了有更好的内存管理,RxSwift当然也是需要拥有销毁者的。不要程序不完整。
之前一直就是

    let disposeBag = DisposeBag()
      ****.disposed(by: disposeBag)

这样调用。不调用系统就会报警告。Result of call to 'subscribe(onNext:onError:onCompleted:onDisposed:)' is unused

报警告信息.png
没有分析原理。知道OC的MRC是谁创建谁销毁的原理。这个看着像是个袋子,先把要销毁的装着。等到一定的时机在进行销毁。那么这个一定的时机是什么时候呢?
看一下源码
  private func _insert(_ disposable: Disposable) -> Disposable? {
        self._lock.lock(); defer { self._lock.unlock() }
        if self._isDisposed {
            return disposable
        }

        self._disposables.append(disposable)

        return nil
    }

insert进行插入

  private func _dispose() -> [Disposable] {
        self._lock.lock(); defer { self._lock.unlock() }

        let disposables = self._disposables
        
        self._disposables.removeAll(keepingCapacity: false)
        self._isDisposed = true
        
        return disposables
    }
    

removeAll进行全部移除

/**
Thread safe bag that disposes added disposables on deinit.
This returns ARC (RAII) like resource management to RxSwift.
In case contained disposables need to be disposed, just put a different dispose bag
or create a new one in its place.
self.existingDisposeBag = DisposeBag()
In case explicit disposal is necessary, there is also CompositeDisposable.
*/

官方给的解释我理解是类似于ARC的回收机制。通过Bag进行内存的回收与释放。
通过self._lock.lock(); defer { self._lock.unlock()控制释放和插入的顺序问题。

上一篇 下一篇

猜你喜欢

热点阅读