一、記憶體洩漏
- 記憶體洩露指當一個物件或變數在使用完成後沒有釋放掉, 這個物件一直佔用著這部分記憶體, 直到應用停止。
二、記憶體洩漏的原因分析
- 在目前主要以ARC進行記憶體管理的開發模式,導致記憶體洩漏的根本原因是程式碼中存在迴圈引用,從而導致一些記憶體無法釋放,這就會導致dealloc()方法無法被呼叫。主要原因大概有一下幾種型別:
(1)動畫效果產生的無限迴圈
(2)多個物件間的相互強引用
(3)定時器NSTimer的使用
(4)程式碼塊block的強引用
(5)代理delegate未使用正確的方法修飾
- 解決方法:
(1)在檢視控制器即將消失時,移除動畫特效;
(2)物件間採用弱引用;
(3)在檢視控制器即將消失時,停止定時特效;
(4)程式碼塊中的使用弱引用;
(5)儘量使用assign或者weak;
- 要注意一點,並非所有的block都需要使用weak來打破迴圈引用,如果self沒有持有block就不會造成迴圈引用。
三、查詢洩漏點 (兩種工具)
- Analyze
- 學 名: 靜態分析工具
- 查 找: 可以通過 Product ->Analyze 選單項啟動
- 快捷鍵: CMD+shift +b
- Analyze主要分析以下四種問題:
- 邏輯錯誤:訪問空指標或未初始化的變數等;
- 記憶體管理錯誤:如記憶體洩漏等;
- 宣告錯誤:從未使用過的變數;
- Api呼叫錯誤:未包含使用的庫和框架。
- Instruments-Leaks
- 學 名: 動態分析工具
- 查 找: Product ->Profile 選單項啟動
- 快捷鍵: CMD + i
- 簡 介:它有很多跟蹤模組可以動態分析和跟蹤記憶體, CPU 和檔案系統。
四、Analyze使用方法
- 在 Analyze 靜態分析結果中, 凡是有圖示 都是工具發現的疑似洩露點。
- 注意:這裡使用Analyze查詢出來的洩漏點,稱之為“可疑洩漏點”。之所以稱之為"可疑洩漏點",是因為這些點未必一定洩露,確認這些點是否洩露, 還要通過 Instruments 動態分析工具的 Leaks 和 Allocations 跟蹤模板. Analyze 靜態分析只是一個理論上的預測過程。
五、Leaks使用方法
- 1.介面介紹
在 instruments 中,雖然選擇了 Leaks 模板,但預設情況下也會新增 Allocations 模板.基本上凡是記憶體分析都會使用 Allocations 模板, 它可以監控記憶體分佈情況。
① 選中 Allocations 模板,(圖1區域),右邊的3區域會顯示隨著時間的變化記憶體使用的折線圖,同時在4區域會顯示記憶體使用的詳細資訊,以及物件分配情況。
② 點選 Leaks 模板(圖中2區域), 可以檢視記憶體洩露情況。如果在3區域有 紅X 出現, 則有記憶體洩露, 4區域則會顯示洩露的物件。
- 2.使用Leaks進行監測
點選洩露物件可以在(下圖)看到它們的記憶體地址, 佔用位元組, 所屬框架和響應方法等資訊.開啟擴充套件檢視, 可以看到右邊的跟蹤堆疊資訊
- 3.監測結果分析: