iOS效能優化 - 工具Instruments之Leaks記憶體洩漏

Simba_LX發表於2018-08-01

一、記憶體洩漏

  • 記憶體洩露指當一個物件或變數在使用完成後沒有釋放掉, 這個物件一直佔用著這部分記憶體, 直到應用停止。

二、記憶體洩漏的原因分析

  • 在目前主要以ARC進行記憶體管理的開發模式,導致記憶體洩漏的根本原因是程式碼中存在迴圈引用,從而導致一些記憶體無法釋放,這就會導致dealloc()方法無法被呼叫。主要原因大概有一下幾種型別:

(1)動畫效果產生的無限迴圈

(2)多個物件間的相互強引用

(3)定時器NSTimer的使用

(4)程式碼塊block的強引用

(5)代理delegate未使用正確的方法修飾

  • 解決方法:

(1)在檢視控制器即將消失時,移除動畫特效;

(2)物件間採用弱引用;

(3)在檢視控制器即將消失時,停止定時特效;

(4)程式碼塊中的使用弱引用;

(5)儘量使用assign或者weak;

  • 要注意一點,並非所有的block都需要使用weak來打破迴圈引用,如果self沒有持有block就不會造成迴圈引用。

三、查詢洩漏點 (兩種工具)

  1. Analyze
  • 學 名: 靜態分析工具
  • 查 找: 可以通過 Product ->Analyze 選單項啟動
  • 快捷鍵: CMD+shift +b
  • Analyze主要分析以下四種問題:
    1. 邏輯錯誤:訪問空指標或未初始化的變數等;
    2. 記憶體管理錯誤:如記憶體洩漏等;
    3. 宣告錯誤:從未使用過的變數;
    4. Api呼叫錯誤:未包含使用的庫和框架。
  1. Instruments-Leaks
  • 學 名: 動態分析工具
  • 查 找: Product ->Profile 選單項啟動
  • 快捷鍵: CMD + i
  • 簡 介:它有很多跟蹤模組可以動態分析和跟蹤記憶體, CPU 和檔案系統。

四、Analyze使用方法

  • 在 Analyze 靜態分析結果中, 凡是有圖示
    iOS效能優化 - 工具Instruments之Leaks記憶體洩漏
    都是工具發現的疑似洩露點。
  • 注意:這裡使用Analyze查詢出來的洩漏點,稱之為“可疑洩漏點”。之所以稱之為"可疑洩漏點",是因為這些點未必一定洩露,確認這些點是否洩露, 還要通過 Instruments 動態分析工具的 Leaks 和 Allocations 跟蹤模板. Analyze 靜態分析只是一個理論上的預測過程。

五、Leaks使用方法

  • 1.介面介紹
    iOS效能優化 - 工具Instruments之Leaks記憶體洩漏

在 instruments 中,雖然選擇了 Leaks 模板,但預設情況下也會新增 Allocations 模板.基本上凡是記憶體分析都會使用 Allocations 模板, 它可以監控記憶體分佈情況。

① 選中 Allocations 模板,(圖1區域),右邊的3區域會顯示隨著時間的變化記憶體使用的折線圖,同時在4區域會顯示記憶體使用的詳細資訊,以及物件分配情況。

② 點選 Leaks 模板(圖中2區域), 可以檢視記憶體洩露情況。如果在3區域有 紅X 出現, 則有記憶體洩露, 4區域則會顯示洩露的物件。

  • 2.使用Leaks進行監測

點選洩露物件可以在(下圖)看到它們的記憶體地址, 佔用位元組, 所屬框架和響應方法等資訊.開啟擴充套件檢視, 可以看到右邊的跟蹤堆疊資訊

iOS效能優化 - 工具Instruments之Leaks記憶體洩漏

  • 3.監測結果分析:

iOS效能優化 - 工具Instruments之Leaks記憶體洩漏

相關文章