// 序列
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进行操作的

相关内存管理的问题:
self.person.rx.observerWEAKL.
->KVOObservable - > person
会不会有循环引用?请看:

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