2010-07-19 85 views
3

我正在接近完成我的應用程序的發佈,並試圖使用儀器來修復任何內存泄漏。爲什麼我在設備上使用儀器而不是在模擬器上存在內存泄漏

爲什麼在使用儀器和我的設備時可以發現一處內存泄漏,而當我使用iPhone模擬器時卻不能?我知道這是一個高層次的問題,但我不認爲發佈任何代碼會幫助反正(相當多的代碼...)。

是否有可能讓儀器指向它認爲泄漏的源代碼?我可以在使用模擬器時做到這一點,但是在將它用於設備時它似乎不起作用(對象由地址表示(我假設)在爲模擬器運行時會看到它是什麼對象,設置問題?)

在此先感謝!

問候, 尼克拉斯

更新:莫非有事情做與OSX是有自動垃圾收集,但iOS不?

回答

7

僅信任設備。這就是您的用戶將用來運行您的應用程序。
不要相信模擬器。
作爲一個演示,我只是故意將泄漏添加到項目中。在模擬器中未檢測到泄漏,但在設備上按預期顯示。
模擬器就是這樣:模擬器。加速工作可能會很有用,但絕不會取代設備。

Once Instruments向您顯示泄漏的物體,您可以雙擊它。它會顯示你的代碼負責泄漏的部分。這適用於模擬器和設備。
當您爲設備編譯時,確保您處於調試模式(並且此模式的設置保留了所有符號)。



一些更多的提示,可能對您有用:

對於一個更流暢的會話,禁用「自動泄漏檢查」,並且適當的時候手動按下「檢查是否有泄漏現在」按鈕。

「構建和分析」命令將幫助您找到泄漏問題,做出出色的工作。它不是(完全)神奇的,所以它不會發現所有的泄漏。例如,泄露的iVars不會被識別。但是對於一個方法的範圍來說,這真是太棒了。
我強烈建議在您的編譯設置中激活「運行靜態分析器」標誌(或者如果您的編譯器速度較慢,則僅用於「發佈」模式)。

如果您想了解如何使用工具來發現泄漏,請閱讀本文檔蘋果更多信息:Instruments User Guide: Built-in InstrumentsInstruments User Guide: Viewing and Analysing Trace Data > Looking for Memory Leaks
您還可以觀看WWDC相關會議的視頻。
如果你仍然不知道你的泄漏來自哪裏,那麼是時候重新閱讀Memory Management Programming Guide

謝謝你想要發送一個無泄漏的應用程序。使用iOS 4,現在比以往任何時候都更加重要。

+0

感謝您的回答!我已經使用了Build and Analyze,它幫助我找到了一些泄漏。但是,經常「太」也會解決某些問題和其他一些問題。我只是清理代碼(主要是NSLogs和註釋),然後內存泄漏消失了......並不是所有人都試圖修復內存泄漏......? (你不必回答這個問題......)) – Nicsoft 2010-07-21 07:04:06

0

如果您還沒有看看構建菜單中方便的「構建和分析」選項。它將運行通常做得很好的靜態分析器。如果什麼都沒有出現,你應該有時間回顧一下Instruments上的WWDC會話視頻。

在硬件上進行性能分析是無可替代的,並且在調試器和儀器連接的情況下,您可以獲得模擬器上下文中的所有內容。

+0

謝謝你的回答。我已經完成了構建和分析,它幫助了我一些,但也標記了一些「不必要的」活動(例如,當在if子句中定義實際變量的if子句中分配新對象變量時,然後返回「返回[變量autorelease]「,它肯定會在之前分配)。 – Nicsoft 2010-07-21 07:08:44