16.RxSwift 内存管理(上)

458 阅读1分钟
// 序列
self.person.rx.observeWeakly(String.self, "name")
            .subscribe(onNext: { (change) in
                print("observeWeakly订阅到了KVO:\(String(describing: change))")
            })
            .disposed(by: disposeBag)

observeWeakly方法中调用observeWeaklyKeyPathFor

返回了一个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进行操作的

相关内存管理的问题:

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

这里使用的是unowned弱引用,就打破了KVOObservable-> person的强引用,也就不会产生循环引用了 2. unowned =(unsafaun_unretian)属于弱引用