我正在使用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
此错误总是表示对象被过早释放,或者是意外释放:
message sent to deallocated instance
第一步是找出哪个对象(实例)被释放了。要做到这一点,你应该在Xcode中进入Product -> Manage Schemes,然后双击(编辑)你项目的scheme。在Diagnostics选项卡中,打开Enable Zombie Objects。下次发生错误时,您将获得有关已释放实例的更多信息。
由于这是相当低级的,并且表明EAGLView本身已被释放,因此您应该检查对CCDirector的任何调用是否可能释放视图。例如:[[CCDirector sharedDirector] end];
此外,由于这种情况发生在多次切换场景之后,我怀疑您存在内存泄漏,这可能会导致某些子系统由于内存级别2的警告而关闭。我建议在appdelegate的内存警告消息以及场景的dealloc方法中设置一个断点。如果场景的dealloc方法的断点从未被触发,那么您将泄漏整个场景,可能是因为保留周期。如果你在自己的数组中存储场景层次结构中的节点,或者过度保留节点或多个相互引用的节点,这很容易发生。
试试这个在场景之间切换:[[CCDirector sharedDirector] replaceScene:[MenuSceen scene]];
和实现你添加:
+(id) scene
{
CCScene *scene = [CCScene node];
MenuSceen *layer = [MenuSceen node];
[scene addChild: layer];
return scene;
}