2010年7月17日 星期六

[IPhone] 如何使用Leak檢查記憶體洩漏

簡介
在 IPhone 程式開發中,記憶體洩漏(Memory Leak)是個很容易發生的情況, 因為 IPhone 必須自行作記憶體管理.
現在的開發者, 大多習慣用 .NET 或 Java 等有垃圾回收機制的開發語言來作開發, 因此可能較不習慣自行釋放記憶體.

背景
從我首次接觸 Xcode 開發 IPhone 程式已有三個半月,這段時間中,我看過不少如何找出記憶體洩漏(Memory Leak的文章),可是由於基本觀念不夠好,繞了不少遠路.
在 IPhone 程式開發中,使用 NSLog 直接在 Console 印出 retainCount 也是一個檢視記憶體洩漏的方法, 但是XCode 提供了更方便的 Leak 工具供開發者使用.
介於自身觀念較差, 因此剛開始使用 Leak 的時候, 也花了不少時間走過彎路,
因此寫下自身經驗, 期望能幫助更多開發者.

如何使用Leak

1. 如同上圖所示,在XCode工具列, Run => Run with Performance Tool => Leak
2. 這樣Leak就會啟動
3. 同時我將 [m_Images release] 註解起來
4. 接下來讓我們來看執行結果吧!
5. 這個是我目前正在開發的遊戲專案, 由於某個物件會隨著遊戲進行, 會動態產生或從畫面移除, 因此在綠色框框的地方,可以看到記憶體的 Leak 不段增加
6. 上圖下方的列表, 告訴我們在 CloudAnimation::LoadImage 中, 有個陣列沒被釋放
7. 點擊後, 就顯示了該程式碼的情況
8. 接下來, 我將註解掉的測試的程式碼還原, 然後再次執行 Leak.
9. 記憶體洩漏就沒了xd
10. 這個圖裡面看到的一些記憶體洩漏, 是因為那些音樂正在播放, 正在使用中的東西, 當然不會釋放, 另外也有部份是 SDK 的 bug.

參考
Fix memory leaks with instruments

沒有留言:

張貼留言

嘎嘎嘎