使用 Instruments 檢測內存泄漏

內存管理是 iOS 裏一大重要內容,經歷過 MRC 時代的開發者或多或少都被引用計數折磨過,後來蘋果推出了 ARC (Automatic Reference Counting),這一技術大大減輕了內存管理的工做量,也下降了因內存管理而出錯的機率。但在 ARC 下仍是有一些場景會致使內存泄漏,例如循環引用、強引用再也不使用的對象。git

Instruments Leaks

我寫了一個 Demo 來進行下面的演示,列舉了 3 種內存泄漏的場景,頁面截圖以下所示:github

  • Strong reference 是用一個數組強引用了一個 ViewController,致使這個 ViewController 退出 navigation stack 後還被強引用引發內存泄漏
  • Block retain cycle 就是常見的 block 致使的循環引用
  • NSTimer retain cycle 是常見的 NSTimer 致使的循環引用

要檢測內存泄漏咱們首先想到的是用 Instruments 的 Leaks 來檢測,對以上 3 種情形分別不斷 push、pop 後的結果以下所示:數組

Strong reference:

Strong normal:

Block retain cycle:

Block normal:

Timer retain cycle:

Timer normal:

Leaks 裏還有一個選項 Cycles & Roots 可以分析出有循環引用的地方,以下圖所示:3d

經過以上截圖咱們發現只有 block 致使的循環引用可以被 Leaks 檢測出來,可是總的內存使用狀況只增不減確定是有問題的,下面咱們使用 Allocations 進行更具體的分析。orm

Instruments Allocations

咱們選擇 Allocations 從新開始分析,和上面同樣不斷進行 push、pop 操做,結果以下圖所示:cdn

再對比沒有內存泄漏的狀況:對象

經過以上對比咱們能夠看出正常狀況下 push 再 pop 後對應的 ViewController 就被釋放了,Total 這一欄裏也就不會被列出;而有內存泄漏的類會被列出,這樣咱們就找出了具體的類,而後就能夠針對這個類的使用狀況再深刻排查可能會出現內存泄漏的地方。blog

Record reference counts

若是要更進一步查看某一個類的引用計數狀況,咱們能夠打開 Record reference counts,具體操做以下圖所示:內存

打開這個選項後咱們再進行前面的操做,結果以下圖所示:開發

總結

雖然使用了 ARC 後可以大大避免內存泄漏的出現,但仍是會有一些場景會致使內存泄漏,上述例子裏的場景都仍是比較常見比較容易避免的,在調用鏈長的時候一些循環引用就比較難被發現了,所以咱們在開發完一個功能模塊後使用 Instruments 系統的檢測一遍是比較好的習慣。

你們也能夠下載這個 Demo 用 Instruments 實際操做體驗一遍,enjoy~

相關文章
相關標籤/搜索