0

我正在使用 cocos2d 并遇到以下问题:第一次初始化场景时,我开始使用:

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

在场景之间切换时,我总是使用:

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

这很好用,我可以从 MenuScene 切换到 GameScene,然后切换到 GameOverScene,然后再切换回 MenuScene。但是当我再次切换到 GameScene,然后再次切换到 GameOverScene 并尝试第二次切换到 MenuScene(第三次,如果您计算初始 runWithScene 调用)时,应用程序崩溃并且我收到错误消息:

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

根据我的阅读,应该至少存在一个场景(这里应该是这种情况?)。我还尝试通过对所有其他场景使用 pushScene 并在最后使用 popScene 返回到 MenuScene 来保持初始场景不变,但是我在第二次运行时也遇到了同样的错误。

我的 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并双击(编辑)您项目的方案。在诊断选项卡中,打开启用僵尸对象。下次发生错误时,您将获得有关已释放实例的更多信息。

由于这是非常低级的,并且表明 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 回答