2012-02-04 72 views
10

我將一些舊代碼移植到Objective-C ARC(自動引用計數),它似乎工作得很好。除了一個相當大的高級對象,當它從我的導航堆棧彈出時沒有被釋放,使我相信我有一個保留循環,ARC對我隱藏了某處(或者至少很難追蹤到)。什麼是最好的方法來清除這個潛在的保留週期和/或什麼是確定ARC下內存泄漏的原因的好方法?謝謝!ARC圓形保留檢測

回答

16

最好的方法是使用the Leaks instrument in the Instruments app

有什麼新在儀器視頻從WWDC 2011討論了使用儀器找到留住ARC下個週期,在開始約38分鐘。

+0

外貌就像我找到它!有一個塊引用是__unsafe_unretained;更改爲__weak __block爲lols,並且似乎已修復它。注:儀器沒有找到這個,並且確實沒有將其標記爲潛在的泄漏情況。無論如何感謝您的建議! – Grimless 2012-02-04 10:07:43

+0

經過一些額外的挖掘後,哎呀,結果泄漏仍然存在。但是,當我將它推到導航堆棧上時,它只會泄漏...如果我使用-init或-initWithNibName:bundle :,然後無參考,它會正確地取消分配。否則,當我將它推入導航堆棧然後彈出時,它不會釋放。 – Grimless 2012-02-04 10:59:44

26

我只是轉變舊的應用程序使用ARC。儀器顯示沒有泄漏,但分配繼續增加。我發現,通過查看活着的物體,我知道應該刪除的東西,我能夠在沒有發佈的情況下追蹤保留物。以下是基本步驟:

  1. 使用在儀器
  2. 播放與您的應用程序的分配工具的一段時間(如果你知道是不是被釋放的東西,這正好更快)
  3. 更改統計到對象在分配跳吧
  4. 排序分類,並找到自己未發行的對象
  5. 找到一個活生生的實例的類名,然後點擊旁邊的小右箭頭,內存地址
  6. 現在你可以看到重新史含有雜質並釋放用於對象

Screenshot of object history in Instruments