Cocos2d:场景切换时的内存问题([EAGLView swapbuffers])

时间:2011-11-07 00:24:12

标签: iphone memory cocos2d-iphone eaglview

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

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

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

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

这很好用,我可以从MenuScene切换到GameScene,然后切换到GameOverScene,然后返回到MenuScene。但是当我再次切换到GameScene,然后再次切换到GameOverScene并尝试第二次切换到MenuScene(第3次,如果计算初始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

2 个答案:

答案 0 :(得分:1)

此错误始终表示对象过早或意外释放:

message sent to deallocated instance

第一步是找出哪个对象(实例)已被解除分配。为此,您应该转到产品 - >在Xcode中管理方案,然后双击(编辑)项目的方案。在诊断标签中,启用启用Zombie对象。下次发生错误时,您将获得有关解除分配的实例的更多信息。

由于这是非常低级的并且表明EAGLView本身已被释放,因此您应检查是否可能释放视图的对CCDirector的任何调用。例如:[[CCDirector sharedDirector] end];

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

有关保留周期的更多信息hereherehere

答案 1 :(得分:0)

尝试使用此场景切换场景:     [[CCDirector sharedDirector] replaceScene:[MenuSceen scene]];

和你添加的实现:

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