CCTimer使用预定选择器泄露在cocos2d-iphone 1.0.1中

时间:2013-12-15 22:43:14

标签: ios objective-c memory-leaks cocos2d-iphone

我现在正在使用Leaks乐器在我的cocos2d-iphone 1.0.1游戏中寻找内存泄漏。

到目前为止,我已经解决了几个问题。但有一个对象被泄露,我无法理解:

它是CCTimer个对象。导致此泄漏的线是

// This method is called when you encounter a random battle.
-(void)transitionToBattle {
    [self unschedule:@selector(transitionToBattle)];

    // Displays a "loading" screen
    [self schedule:@selector(battleLoading)interval:0.5];

    // Enters actual battle scene
    [self schedule:@selector(enterBattle) interval:0.8];   // <--- Leak here
}

不确定是否相关,但enterBattle方法是

-(void)enterBattle {
    [self unschedule:@selector(enterBattle)];

    glColor4f(1, 1, 1, 1);
    [[CCDirector sharedDirector]pushScene:[BattleScene scene]];
}

battleLoading仅在屏幕上显示一个精灵:

-(void)battleLoading {
    [self unschedule:@selector(battleLoading)];

    // The scene itself is running a CCRotateBy action, so I'll stop it
    [self stopAllActions];

    // << Create CCSprite for "now loading" here >>

    // It is possible for the scene to be rotated, so let's fix that
    self.rotation = 0.0;

    // Make sure that the rotation fix is noticed
    [[CCDirector sharedDirector]drawScene];
}

我知道cocos2d使用CCTimer来控制预定的选择器。但是,我对如何泄漏CCTimer没有最微妙的想法。

这些方法所在的代码非常大,但我确定上面的代码段是唯一引用enterBattle的部分。

一旦你已经进入战斗场景,我就会注意到泄漏,所以当你退出它时它不会发生。泄漏并不总是经常发生。

我可以看到上面的细节不太准确,很难找出问题所在。因此,我想知道是否有合理的方法来调试泄漏的CCTimer因为时间表。什么可能导致这种情况?


似乎只有这个特定的时间表才会发生。我有很多其他的,似乎没有像这样泄漏。

1 个答案:

答案 0 :(得分:0)

似乎罪魁祸首就是这样:

[[CCDirector sharedDirector]drawScene];

在我的battleLoading方法中。

我真的不知道为什么。我刚刚删除它,到目前为止我还没有看到泄漏。

看一下CCDirectorIOS的这个方法,它似乎做了一些与调度程序有关的事情。也许它对时间表不太友好,特别是当你改变场景或什么的时候。