0

我的游戏使用了一个场景和多个图层。

当用户转到另一个游戏屏幕时,我从场景中删除当前图层,删除当前图层,设置当前图层 = 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请求完成。用户应该可以中止加载屏幕并切换到他们想要的下一个屏幕。

  1. 那么我应该调用“删除 m_currentLayer”而不是 m_currentLayer->release() 吗?据我所知,release 会减少引用计数,我只想确保“noone”使用 m_currentLayer 而不是 m_scene,所以我使用了“delete”。但我不确定这是正确的方法。

  2. 如果我在这种情况下使用释放功能,我担心代码中的某些地方会使用层并增加层的保留计数,这会导致内存泄漏问题吗?

  3. 如果 m_currentLayer->retainCount() = 4 并且我调用“删除 m_currentLayer”,那么 m_currentLayer 会发生什么?

我对这些问题感到困惑,请有人给我建议。非常感谢!

4

1 回答 1

0
  1. 您不应手动删除节点。它可能会导致一堆错误。引用
    计数约定是retain在需要确定对象仍然存在时调用release,在不需要该对象时调用。

  2. 仅在对象内部使用retainrelease确实需要其他对象存在。在任何其他情况下,您可以在使用它之前使用分配属性(不要保留对象并检查它不是NULL)。如果某个对象(我们称之为a),不是你的(CCNode例如)保留了另一个对象(我们称之为它b),手动删除b会导致错误的访问错误,因为a会确保它b仍然存在。并且可以调用类似的东西b->doSmth()

  3. m_currentLayer将被删除,但它可能会导致错误,因为保留计数 4 意味着 4 个对象可能会导致上述错误访问错误。

于 2013-09-26T12:36:44.627 回答