通過前面的學(xué)習(xí),到這里RxSwift也已經(jīng)接近完結(jié)了,這里對于內(nèi)存的問題,再次做一個總結(jié),同時這里也有一個問題思考,那就是RxSwift有沒有循環(huán)引用的問題?
在Swift的閉包中我們經(jīng)常會使用到[weak self] 和[unowned self] 來保證在閉包中使用self不會造成循環(huán)引用的問題,那在RxSwift中有沒有相同的問題呢。
在這個問題之前,先來了解一下weak 和?unowned的區(qū)別,weak是相對安全的存在,即使self不存在,也不會造成crash,而unowned 如果self不存在的話,是會讓程序crash掉。
那在閉包中是不是使用了self,就一定會產(chǎn)生循環(huán)引用的問題呢,這里其實并不是的,我們知道循環(huán)引用產(chǎn)生的條件是,相互持有或者相互的間接持有,而weak 和?unowned的存在都是為了打破循環(huán)引用鏈的,所以只是單純的使用self不一定會產(chǎn)生循環(huán)引用的問題,還是要看是否有循環(huán)引用鏈的存在。
在RxSwift中,因為使用了大量的閉包,所以我們在使用self的時候一定要注意是否存在循環(huán)引用的關(guān)系,這里我整理了一個思維導(dǎo)圖大家。

當(dāng)然道理再多也是需要代碼支撐,所以這里還有對cell的一個擴展。RxSwift很強大,根據(jù)項目的不同,我們也可以針對性的去做一些擴展。
extension Reactive where Base: UITableViewCell {
// 這里是對RxSwift調(diào)用take方法的一個擴展
? ? public?var?prepareForReuse: RxSwift.Observable {
? ? ? ? var?prepareForReuseKey:Int8=0
? ? ? ? if?let?prepareForReuseOB = objc_getAssociatedObject(base, &prepareForReuseKey)as?Observable {
? ? ? ? ? ? return?prepareForReuseOB
? ? ? ? }
? ? ? ? let?prepareForReuseOB =Observable.of(
? ? ? ? ? ? sentMessage(#selector(Base.prepareForReuse)).map{ _in}//methodInvoked
? ? ? ? ? ? ,deallocated)
? ? ? ? ? ? .merge()
? ? ? ? objc_setAssociatedObject(base, &prepareForReuseKey, prepareForReuseOB, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
? ? ? ? return?prepareForReuseOB
? ? }
//?這里是對RxSwift調(diào)用DisposeBag方法的一個擴展
? ? public?var?reuseBag:DisposeBag{
? ? ? ? MainScheduler.ensureExecutingOnScheduler()
? ? ? ? var?prepareForReuseBag:Int8=0
? ? ? ? if?let?bag = objc_getAssociatedObject(base, &prepareForReuseBag)as?DisposeBag{
? ? ? ? ? ? return?bag
? ? ? ? }
? ? ? ? let?bag =DisposeBag()
? ? ? ? objc_setAssociatedObject(base, &prepareForReuseBag, bag, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
? ? ? ? _ =sentMessage(#selector(Base.prepareForReuse))
? ? ? ? ? ? .subscribe(onNext: { [weakbase] _in
? ? ? ? ? ? ? ? let?newBag =DisposeBag()
? ? ? ? ? ? ? ? guard?let?base = base?else{return}
? ? ? ? ? ? ? ? objc_setAssociatedObject(base, &prepareForReuseBag, newBag, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
? ? ? ? ? ? })
? ? ? ? return?bag
? ? }
}
這樣就可以更方便的使用RxSwift了。