16.RxSwift 内存管理(上)

// 序列
self.person.rx.observeWeakly(String.self, "name")
            .subscribe(onNext: { (change) in
                print("observeWeakly订阅到了KVO:\(String(describing: change))")
            })
            .disposed(by: disposeBag)
复制代码

observeWeakly方法中调用observeWeaklyKeyPathForbash

返回了一个 observable

而后经过 propertyAttributes判断当前观察的对象的属性是不是 isWeak

建立 propertyObservable:KVOObservable-> ObservableType, KVOObservableProtocol,而且保存了: object, keyPath, options

最后返回这个 propertyObservable .flatMapLatest修饰过的序列,闭包保存一些容错处理。

接着开始subscribe建立AnonymousObserver,并经过self.asObservable().subscribe回调到自身的subscribe()方法闭包

这里建立 observer:KVOObserver-> _RXKVOObserver(OC类), Disposable(协议,便于移除观察者)而且保存了一个闭包 进入 KVOObserver内部,调用了父类的 init:

因为 _RXKVOObserver是个OC类:保存了 target, keyPath, callback,并把咱们的观察者甩锅给了当前的OC类

observeValueForKeyPath中进行 callback回调,并在 dispose子类调用的时候移除观察者

至此,整个observeWeakly的底层原理就结束了,咱们能够看到底层最终仍是经过OC的KVO进行操做的ui

相关内存管理的问题:spa

  1. self.person.rx.observerWEAKL. -> KVOObservable - > person会不会有循环引用?请看:

这里使用的是 unowned弱引用,就打破了 KVOObservable-> person的强引用,也就不会产生循环引用了 2. unowned =(unsafaun_unretian)属于弱引用
相关文章
相关标签/搜索