讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 12.12 調試內存管理的錯誤 >

12.12 調試內存管理的錯誤

雖然在ARC(與Swift)中出現的概率很低,但內存管理錯誤還是有可能出現的,程序員會錯誤地認為這種問題不會發生。經驗表明,你應該盡可能使用每一個工具來找出可能的內存管理錯誤。下面就列出一些工具(參見第9章):

·在應用運行時,你可以通過調試導航器圖表中的內存使用儀表盤來觀測可能出現的內存洩漏或其他不太合理的大量內存使用情況。值得注意的是,模擬器中的內存使用不一定會反映出實際情況!當在設備上運行應用時,請密切關注內存使用儀表盤,然後再決定下一步動作。

·Instruments(Product→Profile)提供了很多優秀的工具來檢測內存洩漏並追蹤每個對象的內存使用情況。

·原始調試有助於確保對象的行為與預期一致。請通過一個print調用來實現deinit。如果它沒有被調用,那就說明對象並沒有銷毀。這可能會發現連Instruments都無法直接探測到的問題。

·野指針是難以追蹤的,不過可以通過「打開zombies」定位它們。可以通過Instruments中的Zombies模板輕鬆做到這一點。此外,還可以編輯方案中的Run動作,切換至Diagnostics頁簽,然後勾選上Enable Zombie Objects。結果就是不會再有對象銷毀;相反,它會被「zombie」所代替,如果向其發送了消息,那麼它就會向控制台打印出消息(「message sent to deallocated instance」)。不過,在追蹤完野指針後,請記得關閉zombies。不要同時使用zombies與Leaks instrument:zombies會導致內存洩漏。

雖然介紹了這麼多工具,但它們也無法解決每一個潛在的內存管理問題。比如,一些對像本身(如包含了一張很大圖片的UIView)很小(可能導致內存管理儀表盤或Instruments並不會認為它們使用了大量內存),但卻需要很大的一塊存儲空間;維護太多對這種對象的引用會導致應用很快就被系統殺死。這種問題是很難追蹤的。