2011-11-07 92 views
0

我使用cocos2d的跑进了以下问题: 我第一次初始化一个场景我开始:的Cocos2D:场景之间切换时内存问题([EAGLView swapbuffers])

[[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 

回答

1

此错误是永远的指示,对象是太快释放或意外:

message sent to deallocated instance 

的第一步是要弄清楚哪个对象(实例)被释放。要做到这一点,您应该在Xcode中使用产品 - >管理方案,然后双击(编辑)您项目的方案。在诊断选项卡中,启用启用僵尸对象。下次发生错误时,您将获得有关释放实例的更多信息。

由于这是相当低级的,并且表明EAGLView本身已被释放,您应该检查是否有可能释放视图的CCDirector的调用。例如:[[CCDirector sharedDirector] end];

此外,由于场面多次切换后出现这种情况,我怀疑你有内存泄漏这可能会导致一些子系统关机,由于第2级的内存警告我建议设置appdelegate的内存警告消息中的断点以及场景的dealloc方法。如果一个场景的dealloc方法的断点从未被触发,那么你正在泄漏整个场景,可能是因为保留周期。如果您将节点存储在您自己的阵列中的场景层次结构中,或者过度保留节点或保留彼此引用的多个节点,则很容易发生这种情况。

更多关于保留周期here,herehere

+0

我已经NSZombie启用,但我没有得到更多的信息。我敢肯定,我并没有释放这个观点,所以我想这与保留周期有关。我现在要研究一下。 – dschihejns

+0

AppDelegate在应用程序崩溃之前未收到任何内存警告。 – dschihejns

0

尝试使用场景之间的切换这一个: [CCDirector sharedDirector] replaceScene:[MenuSceen现场];

与实现添加:

+(id) scene 
{ 
CCScene *scene = [CCScene node]; 
MenuSceen *layer = [MenuSceen node]; 
[scene addChild: layer]; 
return scene; 
} 
+0

这正是发生在我的init() - 方法,只是实现了一点点不同.. – dschihejns