通過前面的學(xué)習(xí),到這里RxSwift也已經(jīng)接近完結(jié)了根灯,這里對(duì)于內(nèi)存的問題,再次做一個(gè)總結(jié)秕豫,同時(shí)這里也有一個(gè)問題思考陕习,那就是RxSwift有沒有循環(huán)引用的問題霎褐?
在Swift的閉包中我們經(jīng)常會(huì)使用到[weak self] 和[unowned self] 來保證在閉包中使用self不會(huì)造成循環(huán)引用的問題,那在RxSwift中有沒有相同的問題呢该镣。
在這個(gè)問題之前冻璃,先來了解一下weak 和?unowned的區(qū)別,weak是相對(duì)安全的存在损合,即使self不存在省艳,也不會(huì)造成crash,而unowned 如果self不存在的話嫁审,是會(huì)讓程序crash掉跋炕。
那在閉包中是不是使用了self,就一定會(huì)產(chǎn)生循環(huán)引用的問題呢土居,這里其實(shí)并不是的枣购,我們知道循環(huán)引用產(chǎn)生的條件是,相互持有或者相互的間接持有擦耀,而weak 和?unowned的存在都是為了打破循環(huán)引用鏈的棉圈,所以只是單純的使用self不一定會(huì)產(chǎn)生循環(huán)引用的問題,還是要看是否有循環(huán)引用鏈的存在眷蜓。
在RxSwift中分瘾,因?yàn)槭褂昧舜罅康拈]包,所以我們?cè)谑褂胹elf的時(shí)候一定要注意是否存在循環(huán)引用的關(guān)系吁系,這里我整理了一個(gè)思維導(dǎo)圖大家德召。
當(dāng)然道理再多也是需要代碼支撐,所以這里還有對(duì)cell的一個(gè)擴(kuò)展汽纤。RxSwift很強(qiáng)大上岗,根據(jù)項(xiàng)目的不同,我們也可以針對(duì)性的去做一些擴(kuò)展蕴坪。
extension Reactive where Base: UITableViewCell {
// 這里是對(duì)RxSwift調(diào)用take方法的一個(gè)擴(kuò)展
? ? 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
? ? }
//?這里是對(duì)RxSwift調(diào)用DisposeBag方法的一個(gè)擴(kuò)展
? ? 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了肴掷。