NSTimer 循環引用造成的 retain cycle
NSTimer 的 retain cycle 的問題
有時我們常常需要在 Controller 中建立一個定時被呼叫的函數,所以會使用到 NSTimer,NSTimer 很容易產生 retain cycle 的狀況,下列一個是很常見的例子
1 | class ViewController: UIViewController { |
有時我們常常需要在 Controller 中建立一個定時被呼叫的函數,所以會使用到 NSTimer,NSTimer 很容易產生 retain cycle 的狀況,下列一個是很常見的例子
1 | class ViewController: UIViewController { |
最近在工作上,因為某些原因,需要很快速地刷新RecycleView內的元素,但是很常出現閃退,追了一下log,發現是下列的原因:
1 | java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 150(offset:150).state:153 |
再進行數據變動時,務必要保證 Adapter 中的數據和移除的數據保持一致,就是當你更新你的集合後,呼叫 notify 方法時, adapter 的更新預期結果和實際集合更新結果不同,就會出現此異常。
例如: 增加了兩條數據,但是 Adapter 的 notify 只增加 5 條數據,這種情況就屬於不一致,簡單來說 Apapter 有個 Size,你的資料結構集合也有 Size,這兩個 Size 在呼叫 notify 方法時必須保持相同。
覆寫 xxxxLayoutManager(看你使用的是 LinearLayoutManager 或是 GridLayoutManager或其他)
1 | public class RecyclerViewLinearLayoutManager extends LinearLayoutManager { |
主要是在添加集合的時候,增加了一層 try catch去解決。
參考 :
前面介紹了關於 RxSwift 的資源管理,這次要來介紹關於
RxJava
的部分,在RxJava
中有一些第三方的資源管理像是 RxLifecycle 這種好用的第三方庫來幫忙在程式碼中,如果沒有及時的回收 Rx 相關的資源,會造成Activity/Fragment
無法銷毀所導致的Memory Leak
,RxLifecycle
的用法就是讓我們的Observable
跟隨著Activity/Fragment
的生命週期去取消訂閱,但是這樣就真的完美解決了RxJava
的記憶體管理問題嗎 ? 我們來看看RxLifecycle
的作者怎麼說。
在介紹關於 RxSwift 基本入門 中提到了一些
RxSwift
的核心概念 -Observable
,我們描述了事件訊息的種類,分別是 :next
、error
、completed
, 當這個Observable
收到error
跟completed
事件訊息時,那麼這個Observable
將不會再接受其他的訂閱事件。 同時在這邊用來分派給此Observable
的記憶體資源就一起被釋放掉了,我們可以將其視為類似ARC
的自動記憶體釋放。 如果你想立刻將Observable
關閉且立刻釋放資源,那麼你需要呼叫dispose
函數,這邊我們可以理解為類似MRC
的手動釋放。
如果一個 Observable
在一定的時間內結束,即使不呼叫 dispose
或者使用 DisposeBag
也不會引發 Memory Leak
。 如果一個 Observable
因為某些原因
沒有結束,那記憶體將會永遠的不會被釋放,所以就算 根據 Observable
的運作原理,我們也會希望透過某些記憶體回收機制來確保不會產生 Memory Leak
的問題。
下面將詳細介紹幾種 RxSwift
的記憶體管理機制。
在之前我們稍微提過
RxSwift
這一個framework
,也有稍微介紹了什麼是Reactive Programming
,那這邊就來詳細談談如何學習以及使用RxSwfit
吧。
首先我們先至 RxSwift Clone
整個 Project
,接著我們這邊使用 Rx.Playground
做為入門的教學,按照官網的操作如下
1 | To use playgrounds: |