2009-06-01 15 views
0

我一直在追蹤爲什麼NSObject引用在顯式釋放時仍然顯示在ObjectAlloc中。事實上,已經將NSObject簡化爲一個基本的shell,一個[[myObject alloc] init]緊跟着一個[myObject release],並且它看起來不像是在ObjectAlloc中發佈的。這是NavigationController應用程序的一個大問題,因爲最近彈出的視圖控制器沒有被釋放,因爲這些'未發佈'的NSObject引用,所以推送/彈出多個視圖控制器。 Hmmmmmm。NSObject release ...仍然出現在ObjectAlloc

我可以把我的代碼放在這裏,並有一堆'你從來沒有得到任何地方。自動釋放池,等等等等。

所以,讓我們來看看蘋果示例的'SeismicXML'示例應用程序...在ObjectAlloc/Leaks中啓動它。在getEarthquakeData中非常基本:

XMLReader *streamingParser = [[XMLReader alloc] init]; 
[streamingParser parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; 
[streamingParser release];   

我看到一堆垃圾在XMLReader中放在ObjectAlloc中,儘管釋放它。我敢打賭,如果我們在此應用上放置「刷新」按鈕來再次調用「getEarthquakeData」,我們會在5次刷新中崩潰應用。

有什麼想法?

+0

您是否嘗試過使用手機或只是模擬器? 這是什麼引起你101退出的實際問題? – 2009-06-01 06:44:39

回答

2

我認爲你對ObjectAlloc工具感到困惑,它會在應用程序的整個生命週期中顯示所有的對象分配。主要用途是隨着時間的推移跟蹤內存使用情況。

我認爲你想要的是一個叫做泄漏的工具,它告訴你沒有任何引用它會泄漏什麼內存。這是指向在被重新分配之前不被髮送的對象的指針。

1

可能有一個autorelease池持有對象。如果你創建了很多自動釋放的對象而沒有將它們從池中清理出來,你會得到泄漏,直到你用自動釋放池返回到外層循環。

下面是autorelease池的工作方式:在主循環中,有一個autorelease池。一切autoreleased去那裏。在每次循環迭代結束時,池中的所有對象都會被釋放。如果您在另一個循環中分配對象,那麼在您返回到主循環之前,它們不會實際釋放。當然,除非你爲循環創建自己的autorelease池。

另一個問題可能是您的對象從未被釋放。如果你在+ alloc和-release之間發生異常,你會得到一個泄漏。解決此問題的一種方法是使用:

[[[XMLReader alloc] init] autorelease] 

最後,您可以在這裏處理垃圾回收。我不太瞭解GC系統,告訴你你應該期待什麼樣的行爲。

+0

同意。閱讀發佈文檔。這是可以接受的行爲。你是否嘗試過手機上的體驗以及模擬器? – 2009-06-01 06:43:55

相關問題