我的游戏使用了一个场景和多个图层。
当用户转到另一个游戏屏幕时,我从场景中删除当前图层,删除当前图层,设置当前图层 = NULL,然后创建一个新图层,将其添加到场景中
void UIManager::openScreen(int screenId){
m_currentScreen = screenId;
CCLayer *newLayer;
if(screenId == MENU_SCREEN){
newLayer = new MenuLayer();
}else{
...
}
if(m_currentLayer != NULL){
m_scene->removeChild(m_currentLayer, true);
delete m_currentLayer;
m_currentLayer = NULL;
}
m_scene->addChild(newLayer);
m_currentLayer = newLayer;
}
在某些层上,我调用一些带有回调的 CCHttpRequest:
setResponseCallback(CCObject* pTarget, SEL_CallFuncND pSelector)
我使用“this”传递给“pTarget”,这意味着这个回调的第一个参数是我的层,它定义了一个 SEL_CallFuncND 选择器。
问题是当用户在屏幕(层)之间切换到快速,但一些缓慢的 CCHttpRequest 仍未完成,并且 UIManager 删除层后将调用响应回调然后我的游戏崩溃:(。我不想锁定屏幕并强制使用等待http请求完成。用户应该可以中止加载屏幕并切换到他们想要的下一个屏幕。
那么我应该调用“删除 m_currentLayer”而不是 m_currentLayer->release() 吗?据我所知,release 会减少引用计数,我只想确保“noone”使用 m_currentLayer 而不是 m_scene,所以我使用了“delete”。但我不确定这是正确的方法。
如果我在这种情况下使用释放功能,我担心代码中的某些地方会使用层并增加层的保留计数,这会导致内存泄漏问题吗?
如果 m_currentLayer->retainCount() = 4 并且我调用“删除 m_currentLayer”,那么 m_currentLayer 会发生什么?
我对这些问题感到困惑,请有人给我建议。非常感谢!