[英]cocos2d dealloc of a scene is never called after replaceScene
我有一个 GameScene,我在其中添加了一个大图像作为孩子。 我想为每个关卡重新创建 GameScene。 但是在玩了几个关卡后,它收到了 memory 警告并最终崩溃。 永远不会调用 dealloc 方法。
从 MainScene 开始,点击“开始”按钮->
[[CCDirector sharedDirector] replaceScene: [GameScene scene]];
清关时->
[[CCDirector sharedDirector] replaceScene: [WinScene scene]];
当点击“下一步”按钮时->
[[CCDirector sharedDirector] replaceScene: [GameScene scene]];
等等......但是GameScene的dealloc永远不会被解雇。 (MainScene 和 WinScene 都可以)
对于 GameScene,我有一个
static GameScene* instanceOfGameScene;
其他相关方法:(我不认为是instanceOfGameScene保留了GameScene,因为这是我常用的方法,在我的其他项目中可以。)
-(id) init {
if ((self = [super init])) {
instanceOfGameScene = self;
etc...
-(void) dealloc {
CCLOG(@"game scene get dealloc'ed");
instanceOfGameScene = nil;
[super dealloc];
}
+(GameScene*) sharedScene
{
return instanceOfGameScene;
}
在 WinScene 中,我执行 [[GameScene sharedScene] removeAllChildrenWithCleanup: YES] 5 秒后,GameScene 的 dealloc 方法终于被触发,程序收到信号:“EXC_BAD_ACCESS”。 在 CCNode class 中 -(void) removeAllChildrenWithCleanup:(BOOL)cleanup 方法的最后一行:
[children_ removeAllObjects];
堆栈更深的错误是CCArray removeAllObjects:
ccArrayRemoveAllObjects(data);
然后是:
/** Removes all objects from arr */
static inline void ccArrayRemoveAllObjects(ccArray *arr)
{
while( arr->num > 0 )
[arr->arr[--arr->num] release];
}
问题解决了。 我将按钮(带有块声明,可能保留 GameScene 的一些对象)放入 onEnter 方法中,并在 onExit 方法中将其删除,而不是仅将所有内容放入 init 方法中。 听起来可能很奇怪,但现在可以了。 ^_^经过一整天的调试,很高兴。
GameScene 没有理由成为 singleton; 当然不是一个糟糕的 singleton。 最肯定不是一个创建不佳的 singleton 在 [super dealloc] 可以调用之前取消设置。 绝对绝对不是一个糟糕的 singleton 甚至没有被正确使用。 singleton 的目的是让 class 在应用程序过程中初始化一次,而不是在 class 本身的生命周期内初始化。
如果修复 singleton 所以它是常规的 class 不能解决问题,那么您的问题出在您没有向我们展示的代码中。
此外,您可以在释放 GameScene 后点击 CCTextureCache 释放未使用的纹理。 这将对 memory 方面有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.