16.RxSwift 記憶體管理(上)
阿新 • • 發佈:2019-12-25
// 序列
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進行操作的
相關記憶體管理的問題:
-
self.person.rx.observerWEAKL.
KVOObservable - > person
會不會有迴圈引用?請看:
unowned
弱引用,就打破了KVOObservable
-> person
的強引用,也就不會產生迴圈引用了
2. unowned =(unsafaun_unretian)屬於弱引用