1. 程式人生 > IOS開發 >16.RxSwift 記憶體管理(上)

16.RxSwift 記憶體管理(上)

// 序列
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,callback,並把我們的觀察者甩鍋給了當前的OC類

observeValueForKeyPath中進行callback回撥,並在dispose子類呼叫的時候移除觀察者

至此,整個observeWeakly的底層原理就結束了,我們可以看到底層最終還是通過OC的KVO進行操作的

相關記憶體管理的問題:

  1. self.person.rx.observerWEAKL.
    -> KVOObservable - > person會不會有迴圈引用?請看:

這裡使用的是unowned弱引用,就打破了KVOObservable-> person的強引用,也就不會產生迴圈引用了 2. unowned =(unsafaun_unretian)屬於弱引用