国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Instruments指南:如何調試內存泄露

2019-11-14 18:33:41
字體:
來源:轉載
供稿:網友

Instruments指南:如何調試內存泄露

開篇

現在,你應該使用的ARC,而不是原來我們使用的MRC或者其他。但是我們在使用ARC的時候也會出現內存泄露的情況。
幸運的是,蘋果為我們提供了Instruments,他可以用來檢測你的應用程序的內存泄露。可能剛學習iOS開發的開發者被這個工具給嚇到了,里面有太多東西了。其實他們是非常了不起的,而且也非常容易使用。
在這篇文章里,你將會通過使用XCode和Instruments來調試和發現內存相關的問題(例如內存泄露)。

開始使用

我們這篇文章的目標就是用一個小demo應用程序檢查和解決我們經常遇到的通常的內存相關的錯誤。demo下載地址:http://pan.baidu.com/s/1c0tvFGk (參考別人的,比較老)
打開Xcode,然后運行小demo,試著去點擊幾個cell,我們會發現它爆了,你得到的是一個可怕地EXC_BAD_access錯誤,調試器沒有什么幫助去解決這個錯誤。
對于許多開發者來說這是很令人沮喪的。因為不清楚問題出在哪里。下面是給開發者的一些建議當你遇到EXC_BAD_ACCESS錯誤的時候:

  • 設置Enable Zombie Objects參數,在可執行選項,這有時候有助于縮小問題原因。具體設置方法是點擊運行右邊的項目,然后選擇Edit Scheme。在Run選項的Diagnositics中設置Enable Zombie Objects。然后Close。再次運行,可能會出現一些問題提示。
  • 使用蘋果的Instruments,例如Leaks來查看內存問題。
  • 在你的代碼中設置斷點,然后一步一步執行直到接近crash的地方。
  • 嘗試注釋掉相關的代碼,然后直到它工作,然后回溯。

僵尸入侵

不幸的是,NSZombieEnabled選項沒有對僵尸啟示做任何事情,所以你可以拋棄這種方法了。當你使用ENable Zombie Objects時,我們再次運行APP,會發現有下列提示:

2015-08-08 21:37:28.657 PRopMemFun[8190:3281809] *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x7f8251c07890

這時候我們會定位到這句代碼:

 NSString * message = [NSString stringWithFormat:@"Last sushi: %@.  Cur sushi: %@", _lastSushiSelected, sushiString]; 

Bingo!這時候我們知道問題在這行,一個消息發送給了一個已經釋放的string。這行使用了_lastSushiSelected和sushiString。此時sushiString是正常的因為我們在上邊定義了。那么問題就可能出現在_lastSushiSelected上。因為sushiString是自動釋放變量,所以_lastSushiSelected指向他的時候已經被釋放了。因此添加

   _lastSushiSelected = [sushiString retain];

即可解決問題。再次運行發現問題解決。

Build,Analyze 和Recognize

沒有了Crash我們現在看一下是否有內存泄露。通過Product-->Analyze,我們可以看到有兩處內存泄露。分別在

return cell;

- (void)viewDidUnload {    [_sushiTypes release];    _sushiTypes = nil;}

泄露和水管工(Leaks and Plumbers)

現在我們就使用Instruments。

  • 第一步:首先我們打開Instruments。(按著control+空格鍵,輸入instruments即可打開(也可以Product-->Profile打開)我這邊測試用Product-->Profile打開不能定位帶具體內存泄露代碼)。
  • 第二步:選擇Leaks,然后Choose。
  • 第三步:通過暫停右邊的選擇我們可以選擇正在運行的程序。然后點擊Record(紅色圓圈按鈕)
  • 第四步:觀察,我們可以發現在Leaks里面有一個紅色圓柱,這說明了我們的APP存在內存泄露。
  • 第五步:點擊暫停,然后我們開始分析。
    在Instruments下方的控制臺中,我們把Leaks(如果是Allocation就點擊選擇Leaks)右邊的選項Statistics選擇為Call Trees。然后點擊右邊Call Tree設置,勾選Invert Call Tree 和Hide System Libraries。我們會發現顯示出來的是一個消息名稱。它將會帶你到內存泄露的地方。雙擊那個消息即可。然后你就可以檢查一下那里的代碼,然后思考一下,你應該能發現和解決這個問題。然后解決過后重新運行Leaks去檢測是否還會有內存泄露。

總結

以上就是利用Instruments如何查找內存泄露。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凌源市| 凤冈县| 宝坻区| 甘洛县| 武清区| 会理县| 青阳县| 平南县| 贵州省| 伊宁市| 中超| 武安市| 壶关县| 嘉义县| 正安县| 龙南县| 娄烦县| 宣汉县| 南阳市| 洛浦县| 永嘉县| 五家渠市| 会昌县| 习水县| 屏山县| 沙坪坝区| 望都县| 武强县| 慈溪市| 竹北市| 额济纳旗| 玛沁县| 巫溪县| 阳城县| 巨野县| 黔东| 康平县| 临城县| 栾城县| 霍城县| 冷水江市|