我现在正在使用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
因为时间表。什么可能导致这种情况?
似乎只有这个特定的时间表才会发生。我有很多其他的,似乎没有像这样泄漏。
答案 0 :(得分:0)
似乎罪魁祸首就是这样:
[[CCDirector sharedDirector]drawScene];
在我的battleLoading
方法中。
我真的不知道为什么。我刚刚删除它,到目前为止我还没有看到泄漏。
看一下CCDirectorIOS
的这个方法,它似乎做了一些与调度程序有关的事情。也许它对时间表不太友好,特别是当你改变场景或什么的时候。