2013-12-18 47 views
5

我有一個主菜單,它通過模態segue啓動一個帶SKView/SKScene的視圖控制器。然後我調用dismissViewControllerAnimated,它將應用程序返回到主菜單,但我仍然可以聽到SKScene的聲音效果。當我多次重新啓動SKScene時,應用程序最終崩潰。SpriteKit場景不被釋放

我試過下面的堆積分析教程(http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/),但我似乎沒有得到任何地方。我已經確保釋放所有強@properties ...

有什麼想法可能會導致此問題?任何代碼/屏幕截圖會有幫助,還是我可以提供任何信息來幫助縮小問題的範圍?

Instruments

+2

ARC是否啓用?檢查所有強實例,是否將其中的任何一個存儲在skview/skscene或sk視圖控制器實例之外?另一個常見錯誤是圖結構通用的保留週期,例如,當一個節點對其父節點或兄弟節點之一保持強引用時(使這些節點變弱)。 – LearnCocos2D

+0

是的,使用ARC。回覆。你的第二個問題,任何具有強實例的類將它們設置爲nil,無論是viewDidUnload還是dealloc,是不夠的?我會深入研究代碼來調查你的最後一點。 –

+0

不幸的是,修復所有我能找到的保留週期似乎沒有幫助... –

回答

0

可以實現以下方式你dismissViewControllerAnimated方法調用。

[self dismissViewControllerAnimated:NO completion:^{ 
    // release the SKScene here.... 
}]; 
+0

我沒有使用導航控制器,只是模態segues和UIViewControllers –

+0

好的,在這種情況下,你仍然可以實現dismissViewControllerAnimate:completion block方法並釋放塊中的對象。 – ldindu

+0

當發佈代碼在viewDidUnload中時,爲什麼需要這樣做? –

4

從提供的信息中很難知道。我可以告訴你,我有一個類似的問題,結果與SKAction對象有關。我緩存Actions作爲場景的屬性,然後讓子節點運行這些動作。我發現確保名爲removeAllActions的子節點爲我解決了這個問題。一些沿線:

-(void) willMoveFromView:(SKView *)view 
{ 
    [self.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     SKNode* child = obj; 
     [child removeAllActions]; 
    }]; 

    [self removeAllChildren]; 
} 

不知道這是你所面臨的,但可能是要注意的東西。