2013-11-01 129 views
1

例如,我使用帶輸入流的NSXMLParser。當解析器加載xml節點時,應用程序根據此節點創建NSManagedObject。如果創建了管理對象的計數器(簡單NSInteger的財產)超過50個,應用程序保存管理對象範圍內,則取全部聚集對象數組並refreshObject:OBJ mergeChanges:NO(有對象轉向故障) 滿載後到數據庫應用程序做同樣的事情發生錯誤,然後重置存儲在屬性中的上下文並使其無效並將所有引用清除爲託管對象。結果:50000個對象被保存,但內存部分釋放,沒有完全釋放(剩下約20兆字節)。 導入到coredata在後臺線程做@ autorelease的很多。 泄漏工具未顯示泄漏。我想不通爲什麼內存後沒有釋放操作泄漏工具沒有發現泄漏,但內存不釋放

回答

1

泄漏不是內存增長的唯一原因,也存在被遺棄的內存。這意味着你仍然用指針引用和對象,但是你不再使用。在這裏找到它們是help
還有一件事你應該檢查:autoreleased對象。這些類型的對象被引用到池中。游泳池保留它們直到耗盡。
由於您正在進行解析,所以很可能您正在創建大量自動釋放對象,這些對象將在未來一段時間內(可能在下一次運行循環中)釋放,但您可以通過創建你自己的游泳池。例如,您可以在解析開始之前啓動您的池,並在結束後立即關閉它。 Here是關於如何使用它們的更多信息。

+0

另一個導入到數據庫的線程被autorelease池覆蓋。然後我在蘋果的文章中推薦標記世代。有些代人認爲我主線程的主要(),並分析後說「100%」(這是什麼意思?)。但它只有一次。在其他時代,只包含libsystem_c.dylib調用 – Arsynth

+1

由於您正在輔助線程上執行一些操作,您確定沒有進行保留循環嗎? – Andrea

+0

在「泄漏工具」可以發現泄漏的情況下,它不是保修嗎?所以我在全局隊列中使用dispatch_async。這是個壞主意?在相同的分離線程中創建,編輯和銷燬的託管上下文 – Arsynth

0

可能有很多原因,其中許多人可能與你的代碼做。還有其他一些可能性。你可以啓用殭屍,這會阻止內存被釋放。另外,CoreData也根據需要保留對象。

+0

殭屍已禁用,我檢查過它。 coreData是否保留對象而不管我的代碼? – Arsynth