一、instruments介紹
靈活、強大的工具,可以做性能分析、代碼追蹤、檢查內存泄露等。
二、使用
1、打開方式
Xcode -> Open Developer Tool -> Instruments
2、常用模塊
- Allocations:用來檢查內存分配,跟蹤過程的匿名虛擬內存和堆的對象提供類名和可選保留/釋放歷史
- Leaks:一般的查看內存使用情況,檢查泄漏的內存,並提供了所有活動的分配和泄漏模塊的類對象分配統計信息以及內存地址歷史記錄
- Time Profiler:分析代碼的執行時間,執行對系統的CPU上運行的進程低負載時間為基礎采樣
- Zombies:檢查是否訪問了僵屍對象
3、Allocations(分配)
簡單來說就是不斷的重復某一個場景,查看內存增量,一般情況下,100K以下都屬於正常范圍。
4、Leaks(內存泄露)
- 運行工程,點擊要測試的頁面
- 觀察紅叉,點擊暫停,點擊紅叉
- 底部切換成Call Tree,查看相關代碼
- 限制Call Tree展示,打上右邊的勾,Hide Sys
- 展開底部列表,找到相關代碼
5、Time Profiler (時間分析)
- 真機調試
- 最好使用Release環境配置,接近線上
- 主要看Call Tree 和 Sample List 兩種視圖
-
Running Time:函數運行的時間,這個時間是累積時間
Self:在棧頂次數
Symbol Name:被調用函數的符號信息 - 查看時間異常的列表,展開后定位相關代碼位置
6、Zombies (僵屍對象)
- 概念:過度釋放的對象,對同一個對象釋放了多次;
當引用計數降到0時,對象占用的內存已經被釋放掉,此時指向原對象的指針就成了“懸垂指針”,如若再對其進行任何方法的調用,(原則上)都會直接crash(然而由於某些特殊的情況,不會馬上crash)。過度釋放簡單的說就是對release的對象再release,就是過度釋放。
- 相關概念:內存泄漏:對象使用完沒有釋放,導致內存浪費。野指針:指向僵屍對象(不可用內存)的指針。給野指針發消息會報EXC_BAD_ACCECC錯誤。空指針:沒有指向儲存空間的指針(里面存的是nil,也就是0)。在oc中使用空指針調中方法不會報錯。
- 使用:在Launch Configuration中勾選Record reference counts和Enable NSZombie detection。其中Recordreference counts是顯示引用計數,Enable NSZombie detection是能夠檢測僵屍對象。這樣在程序運行的時候,如果發現僵屍對象它就會彈出一個對話框,點擊其中“→”按鈕,在屏幕的下方會顯示僵屍對象的詳細信息,下圖可以看到僵屍對象的引用計數變化情況。