我有一个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];
}
答案 0 :(得分:2)
问题解决了。我将按钮(带有块声明,可能会保留GameScene的某些对象)放入onEnter方法,然后在onExit方法中删除它,而不是仅将所有内容放在init方法中。这可能听起来很奇怪,但它现在有效。 ^ _ ^经过一整天的调试后很开心。
答案 1 :(得分:0)
GameScene没有理由成为单身人士;当然不是一个创作不佳的单身人士。绝大多数肯定不是一个创建不好的单例,它可以在调用[super dealloc]之前取消自身。绝对绝大多数肯定不是一个创建不佳的单身,甚至没有正确使用。单例的目的是让一个类在应用程序的过程中初始化为ONCE,而不是类本身的生命。
如果修复单例使其成为常规类并不能解决问题,那么您的问题就出现在您没有向我们展示的代码中。
此外,您可以在释放GameScene后点击CCTextureCache释放未使用的纹理。这对你的记忆力有所帮助。