(轉載)IOS- Instruments使用之使用Leaks檢測記憶體流失

來源:互聯網
上載者:User

標籤:lib   ext   board   ice   用處   build   elf   觀察   控制   

轉載 :http://www.zhimengzhe.com/IOSkaifa/255950.html

 

上一篇文章我介紹了Instruments的工具分類和基本使用方法,今天我再來給大家說說Leaks的使用方法。

在早期的iOS開發中,並沒有ARC模式,只有MRC模式,必須由開發人員自己管理記憶體,過程非常繁瑣而且容易造成記憶體流失,如今的iOS開發雖然基本都是用的ARC模式,但是有些情況下還是需要我們自己來管理記憶體,稍有不慎,就可能造成記憶體流失,所以,使用一款記憶體流失的偵查工具還是非常有必要的。

接下來咱們就一起看看Leaks這個工具的使用方法。

 

第一步:建立一個工程,名字隨便取。

在MRC模式下,咱們可以隨便聲明類的對象然後不釋放,造成記憶體流失的問題,但是今天咱們在ARC模式看看記憶體流失是如何出現的

建好工程,Device選項選擇自己的iPhone(選擇真機),然後咱們開啟Instruments(command+i)(你會發現自己手機上多出一個工程,工程名就是你剛才建立的工程),在Instruments工具中選擇Leaks,開啟Leaks。

 

第二步:開始調試。

運行工程,此時Xcode可能會彈出下面這個東東

不要害怕,它只是告訴咱們,請在你的裝置上信任這個應用

步驟:開啟設定->通用->裝置管理->你的開發人員帳號->信任這個帳號

OK,信任完畢,然後再運行工程,沒問題了!

接著開始使用Leaks,工程中 command+control+i開啟它,運行一段時間後我們會發現下面這張圖所示的情況,有很多綠背景的“對號”。這些對號代表沒有記憶體流失,因為咱們緊緊開啟了一個系統預設的第一主視窗。

 

接下來咱們就可以手動添加一些可以造成記憶體流失的代碼了

先建立第二個視圖控制器SecondViewController,然後在storyboard中給第一個控制器介面添加一個按鈕,點擊跳進第二個視圖控制器(ps:不會使用storyboard?請我吃飯我告訴你)

 

在第二個視圖控制器的viewDidLoad方法中添加bug代碼

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGColorRef colorRef = CGColorCreate(colorSpace, (CGFloat[]){1, 0, 0, 0.8});
UIColor *color = [UIColor colorWithCGColor:colorRef];
self.view.backgroundColor = color;

很明顯,沒有釋放colorRef,接下來測試一下。

運行工程,然後command+control+i,這時Leaks會自動重新運行iPhone上的工程並開始記錄資料

點擊按鈕進入第二個介面,讓bug代碼走一遍,再點擊空白返回上個介面,我們會看到有一個紅色背景的“叉符號”,這個就代表記憶體流失

點擊暫停,將滑鼠移到叉號上面點擊鎖定。

點擊下方的“田”字格,選擇callTree

找到右下角工具地區上面 三個表徵圖 的地方,選擇中間的齒輪“?”

選中選項中的 invert Call Tree 和Hide System Libraries

雙擊左邊 Call Tree 下面的任意一行,查看記憶體流失的代碼位置

問題出現了!!!沒有顯示代碼位置!不要慌,這是因為我們沒有設定一個選項

找到工程中的 Build Settings ,輸入 options 尋找,在Build Options 欄目下方找到 Debug Information Format,將其屬性設定為 DWARF with dSYM File

 

為什麼要這麼做呢?

因為 Symbol Name 一欄 下面的 0x1000ea6cb與0x1000ea8c7 是記憶體位址,可是這東西對我來毫無用處。Xcode編譯項目後,我們會看到一個同名的 dSYM 檔案,dSYM 是儲存 16 進位函數地址映射資訊的中轉檔案,我們調試的 symbols 都會包含在這個檔案中,並且每次編譯項目的時候都會產生一個新的 dSYM 檔案。途中顯示0x1000ea6cb與0x1000ea8c7 是因為我們的工程 Build Settings 的問題,沒有產生dSYM 檔案,也就無法解析debug symbols。當我們設定為產生dSYM檔案 後,就可以查看對應的代碼位置資訊了。

 

接下來重新運行工程,重新運行Leaks,重新點擊按鈕填入第二個控制器執行 bug代碼,重新確定記憶體流失、切換為 Call Tree,雙擊問題欄進入代碼位置

終於發現原因啦我們的colorRef變數沒有釋放,那我們就添加一行代碼就可以了:CGColorRelease(colorRef);

再次測試之後發現已經沒有記憶體流失的問題了!

 

然而並不是所有的記憶體流失都會被檢測出來,下面這個情況我覺得可以作為典型的案例說一下。

使用定時器,迴圈列印一句話,在dealloc方法中列印資訊觀察對象是否真的被釋放。

不好意思又說教了哈,大家不要在意。

(轉載)IOS- Instruments使用之使用Leaks檢測記憶體流失

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.