現在,你應該使用的ARC,而不是原來我們使用的MRC或者其他。但是我們在使用ARC的時候也會出現內存泄露的情況。
幸運的是,蘋果為我們提供了Instruments,他可以用來檢測你的應用程序的內存泄露。可能剛學習iOS開發的開發者被這個工具給嚇到了,里面有太多東西了。其實他們是非常了不起的,而且也非常容易使用。
在這篇文章里,你將會通過使用XCode和Instruments來調試和發現內存相關的問題(例如內存泄露)。
我們這篇文章的目標就是用一個小demo應用程序檢查和解決我們經常遇到的通常的內存相關的錯誤。demo下載地址:http://pan.baidu.com/s/1c0tvFGk (參考別人的,比較老)
打開Xcode,然后運行小demo,試著去點擊幾個cell,我們會發現它爆了,你得到的是一個可怕地EXC_BAD_access錯誤,調試器沒有什么幫助去解決這個錯誤。
對于許多開發者來說這是很令人沮喪的。因為不清楚問題出在哪里。下面是給開發者的一些建議當你遇到EXC_BAD_ACCESS錯誤的時候:
不幸的是,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];即可解決問題。再次運行發現問題解決。
沒有了Crash我們現在看一下是否有內存泄露。通過Product-->Analyze,我們可以看到有兩處內存泄露。分別在
return cell;和
- (void)viewDidUnload {    [_sushiTypes release];    _sushiTypes = nil;}現在我們就使用Instruments。
以上就是利用Instruments如何查找內存泄露。
新聞熱點
疑難解答