RxSwift之內(nèi)存管理

通過前面的學(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了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們做開發(fā)的都知道,內(nèi)存管理極為重要,創(chuàng)建的內(nèi)存如果不能及時釋放,積累到一定程度就會讓程序崩潰。RxSwift作為...
    __拼搏__閱讀 1,080評論 2 1
  • 一、循環(huán)引用 weak:弱引用,[weak self],需要解包操作,延遲調(diào)用為nil不崩潰 unowned:無主...
    Code_人生閱讀 1,053評論 0 6
  • 在iOS中采用的引用計數(shù)來管理內(nèi)存,ARC中,編譯階段,系統(tǒng)會自動向代碼中插入內(nèi)存管理代碼,無非就是對對象的引用做...
    yahibo閱讀 904評論 0 8
  • 函數(shù)響應(yīng)編程&RxSwift核心邏輯 上函數(shù)響應(yīng)編程&RxSwift核心邏輯 下待續(xù)...正在努力編寫RxSwif...
    Janek_m閱讀 1,074評論 0 3
  • 內(nèi)存管理老生常談,首先明確不是所有閉包中使用了self,就會造成循環(huán)引用,而是一定要產(chǎn)生循環(huán)引用鏈,那么在使用Rx...
    May_Dobin閱讀 573評論 0 4

友情鏈接更多精彩內(nèi)容