在replaceScene之后永远不会调用场景的cocos2d dealloc

时间:2011-08-13 04:59:30

标签: iphone ios memory cocos2d-iphone

我有一个GameScene,我在那里添加一个大图像作为孩子。我想为每个级别重新创建GameScene。但经过几个级别的游戏后,它会收到内存警告并最终崩溃。 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;

其他相关方法:(我不认为是保留GameScene的instanceOfGameScene,因为这是我常用的方法,在我的其他项目中没问题。)

-(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”。在最后一行 - (void)removeAllChildrenWithCleanup:(BOOL)CCNode类中的清理方法:

[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]; 
}

2 个答案:

答案 0 :(得分:2)

问题解决了。我将按钮(带有块声明,可能会保留GameScene的某些对象)放入onEnter方法,然后在onExit方法中删除它,而不是仅将所有内容放在init方法中。这可能听起来很奇怪,但它现在有效。 ^ _ ^经过一整天的调试后很开心。

答案 1 :(得分:0)

GameScene没有理由成为单身人士;当然不是一个创作不佳的单身人士。绝大多数肯定不是一个创建不好的单例,它可以在调用[super dealloc]之前取消自身。绝对绝大多数肯定不是一个创建不佳的单身,甚至没有正确使用。单例的目的是让一个类在应用程序的过程中初始化为ONCE,而不是类本身的生命。

如果修复单例使其成为常规类并不能解决问题,那么您的问题就出现在您没有向我们展示的代码中。

此外,您可以在释放GameScene后点击CCTextureCache释放未使用的纹理。这对你的记忆力有所帮助。