我有一个 GameScene,我在其中添加了一个大图像作为 child 。我想为每个级别重新创建 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;
其他相关方法:(我不认为是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方法终于被触发,Program收到信号:“EXC_BAD_ACCESS”。在 CCNode 类中 -(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 方法中。这听起来可能很奇怪,但它现在有效。
^_^调试了一整天,很开心。
关于iphone - 场景的 cocos2d dealloc 在 replaceScene 后永远不会被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7048681/