2013-12-18 14 views
5

私はモーダルセグを介して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/)に従ってみましたが、どこにもいないようです。私はすべての強力なプロパティを割り当て解除するようにしました...

この問題の原因は何ですか?任意のコード/スクリーンショットが役立つでしょうか、問題の絞り込みに役立つ情報を提供できますか?

Instruments

+2

ARCが有効になっていますか?すべての強力なインスタンスをチェックし、それらのインスタンスをskview/sksceneまたはsk viewコントローラインスタンスの外に保存しますか?別の一般的なエラーは、グラフ構造に共通の保持サイクルです。たとえば、一方のノードが親ノードまたは兄弟ノードのいずれかに強い参照を保持している(弱いものにする)場合などです。 – LearnCocos2D

+0

ええ、ARCを使用しています。 Re。あなたの2番目の質問は、強いインスタンスを持つどのクラスでも、viewDidUnloadまたはdeallocのいずれにもnilに設定されていません。あなたの最後の点を調べるコードを掘り下げます。 –

+0

残念なことに、私が見つけることができたすべての保持サイクルを修正することは助けに見えませんでした... –

答えて

0

あなたは方法は次の自分のdismissViewControllerAnimatedメソッド呼び出しを実装することができます。

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

私はナビゲーションコントローラを使用していません。モーダルセグエスとUIViewControllers –

+0

その場合でも、dismissViewControllerAnimate:completionブロックメソッドを実装し、ブロック内のオブジェクトを解放できます。 – ldindu

+0

リリースコードがviewDidUnloadにあるときにこれを行う必要があるのはなぜですか? –

4

提供された情報からわかりにくいです。同様の問題があり、SKActionオブジェクトに関連することが判明しました。シーンのプロパティとしてアクションをキャッシュしておき、子ノードにそれらのアクションを実行させました。私は、removeAllActionsという子ノードが私の問題を排除していることを確認しました。線に沿って何か:

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

    [self removeAllChildren]; 
} 

ない、これはあなたが直面しているものですが、外を見るためのものになる可能性がある場合を確認してください。

関連する問題