RxSwift之內(nèi)存管理

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市背传,隨后出現(xiàn)的幾起案子呆瞻,更是在濱河造成了極大的恐慌,老刑警劉巖径玖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痴脾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梳星,警方通過查閱死者的電腦和手機(jī)赞赖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門滚朵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人前域,你說我怎么就攤上這事始绍。” “怎么了话侄?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)学赛。 經(jīng)常有香客問我年堆,道長(zhǎng),這世上最難降的妖魔是什么盏浇? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任变丧,我火速辦了婚禮,結(jié)果婚禮上绢掰,老公的妹妹穿的比我還像新娘痒蓬。我一直安慰自己,他們只是感情好滴劲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布攻晒。 她就那樣靜靜地躺著,像睡著了一般班挖。 火紅的嫁衣襯著肌膚如雪鲁捏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天萧芙,我揣著相機(jī)與錄音给梅,去河邊找鬼。 笑死双揪,一個(gè)胖子當(dāng)著我的面吹牛动羽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渔期,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼运吓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了擎场?” 一聲冷哼從身側(cè)響起羽德,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迅办,沒想到半個(gè)月后宅静,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡站欺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年姨夹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纤垂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磷账,死狀恐怖峭沦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逃糟,我是刑警寧澤吼鱼,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站绰咽,受9級(jí)特大地震影響菇肃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜取募,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一琐谤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玩敏,春花似錦斗忌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翻屈,卻和暖如春陈哑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伸眶。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工惊窖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厘贼。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓界酒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親嘴秸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毁欣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

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