// 序列
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)属于弱引用