0

私は cocos2d を使用していますが、次の問題に遭遇しました。

[[CCDirector sharedDirector] runWithScene: [MenuScene node]];

シーンを切り替えるとき、私はいつも以下を使用します。

[[CCDirector sharedDirector] replaceScene:[SceneName node]];

これは正常に動作し、MenuScene から GameScene に切り替えてから、GameOverScene に切り替えてから、MenuScene に戻すことができます。しかし、もう一度 GameScene に切り替えてから、もう一度 GameOverScene に切り替えて、MenuScene に 2 回目 (最初の runWithScene 呼び出しをカウントする場合は 3 回目) に切り替えようとすると、アプリがクラッシュし、次のエラー メッセージが表示されます。

*** -[EAGLView swapBuffers]: message sent to deallocated instance 0x9614f80
sharedlibrary apply-load-rules all

私が読んだことによると、常に少なくとも 1 つのシーンが存在するはずです (ここではそうでしょうか?)。また、他のすべてのシーンに pushScene を使用し、最後に popScene を使用して MenuScene に戻ることで、最初のシーンをそのまま残そうとしましたが、2 回目の実行でも同じエラーが発生します。

MenuScene の私の実装は次のようになります。

@implementation MenuScene
@synthesize menuLayer = _menuLayer;

- (id)init {

    if ((self = [super init])) {
        self.menuLayer = [MenuLayer node];
        [self addChild:_menuLayer];
    }
    return self;
}

- (void)dealloc {
    [_menuLayer release];
    _menuLayer = nil;
    [super dealloc];
}

@end
4

2 に答える 2

1

このエラーは常に、オブジェクトがリリースされるのが早すぎるか、誤ってリリースされたことを示しています。

message sent to deallocated instance

最初のステップは、割り当てが解除されたオブジェクト (インスタンス) を特定することです。これを行うには、 Xcode でProduct -> Manage Schemesに移動し、プロジェクトのスキームをダブルクリック (編集) する必要があります。Diagnosticsタブで、Enable Zombie Objectsをオンにします。次回エラーが発生すると、割り当て解除されたインスタンスに関する詳細情報が表示されます。

これはかなり低レベルであり、EAGLView 自体の割り当てが解除されていることを示しているため、ビューの割り当てを解除する可能性のある CCDirector への呼び出しを確認する必要があります。例えば:[[CCDirector sharedDirector] end];

また、これはシーンを何度も切り替えた後に発生するため、レベル 2 のメモリ警告が原因で一部のサブシステムがシャットダウンする原因となるメモリ リークが発生している可能性があります。appdelegate のメモリ警告メッセージに次のようにブレークポイントを設定することをお勧めします。シーンの dealloc メソッドと同様に。シーンの dealloc メソッドのブレークポイントがトリガーされない場合は、おそらく保持サイクルが原因で、シーン全体がリークしています。これは、シーン階層内のノードを独自の配列に保存したり、ノードまたは相互参照を保持している複数のノードを過度に保持したりすると、簡単に発生する可能性があります。

リテイン サイクルの詳細については、こちらこちら、およびこちらをご覧ください。

于 2011-11-07T12:16:55.650 に答える
0

シーンを切り替えるには、[[CCDirector sharedDirector] replaceScene:[MenuSceen scene]]; を試してください。

および追加する実装:

 +(id) scene
{
CCScene *scene = [CCScene node];
MenuSceen *layer = [MenuSceen node];
[scene addChild: layer];
return scene;
}
于 2011-11-07T06:58:36.003 に答える