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)屬於弱引用
相關文章
相關標籤/搜索