2013-03-08 15 views
8

恐怕問這個問題可能會導致一些downvotes,但做了一些不令人滿意的研究後,我決定冒險,並要求更有經驗的人...什麼樣的內存泄漏XCode Analyzer可能沒有注意到?

這裏有很多問題指的是一些具體的與XCode Analayzer工具相關的問題。這似乎是非常有幫助的解決方案。但是我想問你 - 作爲iOS世界的初學者 - 這種工具無法注意哪種內存管理的東西。

換句話說,有沒有共同的內存管理方面,哪些iOS的初學者應該認爲「哦,要小心,因爲在這種情況下的XCode分析可能不會警告你自己的錯誤」 ...

舉例來說,我在這裏找到Why cannot XCode static analyzer detect un-released retained properties?說:

(...)分析儀不能可靠地檢測跨越 方法/庫邊界(...)

保留/釋放問題

這聽起來像一個很好的提示來考慮,但也許你知道其他一些常見問題...

+1

只是因爲一個工具可以檢測到泄漏並不意味着你不應該仔細考慮內存管理。這是一個工具,而不是更換仔細的想法。 – 2013-03-08 15:15:28

回答

7

分析儀是發現困擾新程序員在編寫非ARC代碼,則程序泄漏(故障非常好調用release,返回錯誤的保留計數的對象等)。

根據我的經驗,有幾個類型的內存問題沒有找到:

  • 它一般不能識別strong reference cycles(又名retain cycles)。例如,向視圖控制器添加一個重複的NSTimer,但不知道該定時器對視圖控制器保持強烈的引用,並且如果您沒有定時器(或在錯誤的位置執行該操作,例如dealloc方法) ,視圖控制器和定時器都不會被釋放。

  • 它無法找到循環邏輯錯誤。例如,如果您有一些循環引用,其中視圖控制器A呈現視圖控制器B,視圖控制器B又呈現A的新副本(而不是解散/彈出以返回到A)。

  • 它找不到許多非引用計數內存問題。雖然它在處理核心基礎功能方面越來越好,但如果您的代碼正在執行手動內存分配(例如通過mallocfree),則靜態分析器的使用可能會受到限制。每當您使用非引用計數代碼時(例如,您使用SQLite sqlite3_prepare_v2並且未能調用sqlite3_finalize),情況也是如此。

我敢肯定那不是什麼它沒有找到一個完整列表,但這些都是常見的問題,我看問及堆棧溢出針對靜態分析儀將是有限的幫助。但分析儀仍然是一個非常棒的工具(它也發現了內存問題以外的其他問題),對於那些不使用ARC的人來說,這是非常寶貴的。話雖如此,雖然靜態分析儀是一個低估的第一道防線,但您真的應該使用儀器來發現泄漏。請參見儀器用戶指南中的Locating Memory Issues in Your App這是識別泄漏的最佳方法。

+0

你能否闡明一點爲什麼在dealloc中使你的計時器失效會很糟糕? – 2013-03-08 16:34:10

+3

@MarkBernstein只有當沒有更強的視圖控制器引用時才調用'dealloc'。因此,由於重複計時器對視圖控制器保持強烈的引用,因此永遠不會調用它。將'invalidate'放在'dealloc'中類似於「當沒有更強的對這個視圖控制器的引用時,繼續去掉定時器對這個視圖控制器的強引用」。你通常把'invalidate'放在'viewWillDisappear'或類似的東西里,這取決於你的應用程序的細節。 – Rob 2013-03-08 16:40:38