2010-09-14 82 views
0

在我的cocos2d應用程序中,我已經通過它使用儀器並刪除了所有內存泄漏。我有我的遊戲輸出屏幕上正在使用多少內存,隨着遊戲進行,它會不斷上升,直到我最終耗盡內存。屏幕上的對象數量不會每個級別都增加很多。它是一個相當簡單的遊戲,所以我不應該這麼快就會耗盡內存。沒有內存泄漏,但仍然內存不足?

它結束的時候,我從給級別的所有對象和重新分配新的一個新的水平開始時。儀器告訴我沒有內存泄漏。當我通過儀器運行來顯示分配的位置時,問題的大部分似乎不是來自一個地方的所有我的對象。

任何想法可能是什麼問題?

回答

0

大部分問題似乎是sprite不會在cocos2d中釋放,除非所有動作都在這些sprite上停止。這是使用stopAllActions完成的。歡呼所有的建議。

3

只是因爲儀器不顯示泄漏,並不意味着你不還是分配你不使用的內存。注意ObjectAlloc圖表,看看它是否在不斷下降而不下降。

1

如果分配了一個你不使用,不能清理內存,這是一樣糟糕的泄漏,即使你沒有在技術上泄露任何東西,因爲你已經藏匿一些未使用的參考地方。

看你實際需要多少內存使用或保留供將來使用在您的應用程序的任何一點,然後把別人以前分配的泄漏任何東西,並修復它。

+0

據我所知,我清理了目前沒有使用的所有內存。我有幾個不同的對象的NSMutableArrays,並在每個級別結束時,這些被清除,然後釋放。整個遊戲圖層也會在每個關卡的末尾被移除,因此這些圖層中沒有被處理的任何內容都將被視爲儀器泄漏。 – Tiddly 2010-09-14 21:44:35

1

在使用autorelease對象的Objective-C中,謹慎使用循環依賴!

如果您創建對象A然後創建對象B的實例並將A傳遞給它,以便B保留A並且A還保留B(例如將它添加爲A的子元素),您可以輕鬆設置一個圓形依賴關係,因此這兩個對象都不會被釋放。

提示:添加 - (空)dealloc方法,以你的所有場景類,並設置一個斷點。如果你改變一個場景,並且在場景轉換完成後它的dealloc方法沒有被調用,那麼你正在泄漏這個場景(它沒有被釋放)。

嘗試通過查找與上述類似的設置來查找泄漏。

+0

我真的不認爲我的代碼中有任何循環依賴。 – Tiddly 2010-09-15 13:45:20

+0

我已經在所有場景類中都有dealloc方法,並且在那裏放置了斷點,並且在調用[super dealloc]之前檢查了保留計數,它是1,因此對我來說聽起來是正確的。 – Tiddly 2010-09-15 13:46:32

1

請注意自動釋放​​的對象,因爲它們不會立即釋放。如果您的部分有大量的分配和自動釋放,請嘗試在它們上使用特定的自動釋放池。 它創造了巨大的決策樹(使用NSArrays)爲遊戲人工智能發生。

1

檢查內存中聚合對象的好方法是使用Instruments的新功能(在Xcode 3.2.3中)。

對正在運行的應用程序使用正常的Allocations工具。執行一系列應該返回到某個已知狀態的重複事件(例如,在導航控制器中向下一級並返回)。每次執行此操作時,請單擊左側欄中的Mark Heap按鈕以查看分配工具(位於標題Heapshot Analysis部分下方)。

這將做的是在這個重複動作的每個起點標記堆,並將該點創建的對象與最後標記堆時創建的對象進行比較。只有在這兩個點之間創建並且仍然在內存中的對象纔會被列出。

如果您正在累積物體,但它們要麼未泄漏,要麼被泄漏工具遺漏,它們應顯示在此處。我已經發現了一些細微的內存堆積,特別是當您將其與UI自動化儀器配對使自動執行您正在測試的重複性操作時。